Thursday, 15 September 2011

Reliable cube root in Haskell -


I am doing project over and the following is to check if the number is cube:

  isInt x = x = from the integer (round x) isCube x = is $ x ** (1/3)  

but due to a floating point error, it returns false results Is:

  * main & gt; IsCube (384 ^ 3) false  

Is there a way to implement a more reliable cube test?

On one side-note, this is my other solution, which is the filter (isCube) (perms n) :

  cubes = [n ^ 3 N & lt; - [code] does not work due to a type of interface error [1.]] Perms n = map $ permutations $ show n :: [integer] answer = head [n | N & lt; -cubes, (length $ filter (isCube) (perms n)) == 5]   

What should I do to fix the error?

  No examples for the floating integer (RealFRC integer) arising from 'iscube' on prob62. HS: 10: 44-49  

Any customization is also welcome; -)

Try using the floating point number as much as possible, especially if you have There is a problem that is related to integer values ​​Floating point numbers have problems with the sphere and certain values ​​(like 1/3) can not be perfectly represented, so do not you wonder if you get mysterious answers .

First of all, in order to correct your typing error, you have to define isCube again. If you check this type of signature then it looks like:

  isCube :: (RealFrac a, Floating A) => A - & gt; Boole  

Note that it looks like something that is the first argument of class floating . Your problem is that you use this function on integer values And do not have an example of integers floating . You can redefine the isCube to check the function type.

  isCube x = isInt $ (interagral x) ** (1/3)  

However, this will not be true of your program.

One way to make your program more correct is to suggest Heinrich. It will look like this:

  isCube x = (round (from integral x ** (1/3)) ^ 3 == x  

Good luck!


No comments:

Post a Comment