Haskell - 如何检查数字是否为Double / Float?

时间:2010-05-22 22:19:43

标签: haskell floating-point integer

我想做像:

x `mod` 1.0 == 0 // => int

但似乎mod仅适用于int ... help! 编辑: 我想检查给定的数字是否为三角形,http://en.wikipedia.org/wiki/Triangle_number所以我的想法是检查n1是否为Int ...

  

(n *(n + 1))/ 2 = s => n1 =( - 1 + sqrt(1 +   787-8))/ 2

3 个答案:

答案 0 :(得分:7)

要确定某个FloatDouble是否与Haskell中的Integer无法区分,请同时使用floorceiling。类似的东西:

if floor n == ceiling n
  then "It was some integer."
  else "It's between integers."

可能还有一些奇特的东西可以用浮点数表示二进制,由RealFloat类型类公开:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t%3ARealFloat

答案 1 :(得分:2)

检查数字是否为三角形的更好方法是生成三角数列表,然后查看您的候选人是否在其中。由于这是一个学习问题,我将给出提示而不是答案。

使用列表推导生成三角形数字。

因为它们是有序的,你可以知道你是否已经过去了。

如果您使用大数字,另一种方法是使用二进制搜索来缩小可能会导致候选人的行数。

答案 2 :(得分:0)

总编辑:

好的,我仍然不确定你在这里要做什么。

  • 首先,任何模1的都将为零,因为模数函数只对整数有意义。如果要采用小数类型的模数,可以先转换为整数。 修改:虽然值得,但Data.Fixed对非整数值的确有一个mod'函数。
  • 我也不知道你的意思是“检查n1是否为Int”。它是或不是;你不需要在运行时检查。 修改:好的,我现在看到您只是检查一个值是否包含小数组件。 Paul Johnson正确地指出,谨慎使用浮点值来做这些事情是明智的。
  • 如果要在同一计算中混合modsqrt操作,则必须在适当的类型之间手动转换。 fromIntegral会将任何整数类型转换为任意数字类型,floorceilinground会将小数类型转换为整数类型。