f#整数浮点数模数1.0 = 1.0?

时间:2009-08-11 13:49:49

标签: .net math f# modulo

好的我有两个功能,第一个看起来像这样:

let dlth x = float (x.ToString().Length)

取浮点数并返回数字位数,该部分工作正常。第二个函数如下所示:

let droot x = ((x ** (1./(dlth x))) % 1.)

取浮点数并将其提升到等于1.0 /(位数)的幂,然后得到结果并且模数为1.0。整数应该为零。

所以对于droot 36.它需要(36.0 **(1.0 / 2.0))这是6.0然后6.0 mod 1.0等于0.0;

现在,在我尝试编号81.0的地方工作正常。 (以及所有应该工作的81以上的数字)由于某种原因返回1.0,抛弃我的模式匹配。谁能告诉我为什么会这样?

PostScript:这是Project Euler解决方案的一部分。如果您知道哪个问题,请 不要 发布Project Euler解决方案。我只需要帮助弄清楚为什么模数会返回有趣的结果

3 个答案:

答案 0 :(得分:8)

浮点运算在任何语言中都充满了危险。在我的盒子上

printfn "%f" (0.9999999999999 % 1.0)        

打印

1.000000

希望这有助于引导您朝着正确的方向前进。如果你真的想知道浮点数是否是“整数”,那么例如减去最接近的整数并查看绝对值是否小于某个epsilon(例如0.00001)是一个不错的选择。

答案 1 :(得分:1)

如果你的浮动不准确,你可以使用.NET的decimal数据类型(它能够代表基数为10的所有数字)来获得性能。除此之外,使用更多精度(double)或整数数学。

答案 2 :(得分:0)

我同意Brian的观点,依赖于确切的浮点表示是危险的,但我无法重现您的问题。对我而言,droot 81.0给出了0.0的预期结果。您使用的是什么版本的F#?你在.NET或Mono上运行吗?