0

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

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 解决方案。我只需要帮助弄清楚为什么模数会返回有趣的结果

4

3 回答 3

8

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

printfn "%f" (0.9999999999999 % 1.0)        

印刷

1.000000

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

于 2009-08-11T14:04:01.167 回答
1

如果您发现浮点数不准确,您可能会受到 .NETdecimal数据类型(它能够表示以 10 为基数表示的所有数字)的性能影响。除此之外,使用更高的精度 ( double) 或整数数学。

于 2009-08-11T15:21:06.377 回答
0

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

于 2009-08-11T15:17:17.163 回答