我正在编写一个计算 PI 值并将其作为双精度值返回的函数。到现在为止还挺好。但是一旦函数到达小数点后 14 位,它就不能再容纳了。我假设这是因为双精度有限。我应该怎么做才能继续获得更多小数点后的数字?
问问题
6798 次
6 回答
16
我根本不会用浮点数来做。
回想一下,您的算法是:
(1 + 1 / (2 * 1 + 1)) *
(1 + 2 / (2 * 2 + 1)) *
(1 + 3 / (2 * 3 + 1)) *
(1 + 4 / (2 * 4 + 1)) *
(1 + 5 / (2 * 5 + 1)) *
(1 + 6 / (2 * 6 + 1)) *
(1 + 7 / (2 * 7 + 1)) * ...
在计算分数的过程中的每个阶段。为什么不简单地将分数保留为分子/分母形式?您要计算的分数是:
(4 / 3) *
(7 / 5) *
(10 / 7) *
(13 / 9) * ...
这只是顶部的 4 * 7 * 10 * 13 ... 和底部的 3 * 5 * 7 * 9。
为自己获取一个 BigInteger 类(System.Numerics 中的 4.0 框架附带),您可以轻松计算所需的分子和分母。那么你只是有将商转换为小数的问题。好吧,这很容易。想必你知道怎么做长除法。只需在分子和分母上实现一个长除法算法,即可得出所需的位数。
于 2010-11-05T15:12:17.090 回答
8
您需要多少精度?
使用decimal
将为您提供大约 28 位小数:
decimal pi = 3.14159265358979323846264338327950288419716939937510m;
Console.WriteLine(pi); // 3.1415926535897932384626433833
如果这对您来说还不够,那么您将需要搜索某种 BigDecimal 实现,或者查看其他技术来执行计算。
于 2010-11-05T14:59:43.057 回答
1
尝试decimal
而不是双倍。它不能存储两倍大的数字,但我认为它在小数点后具有更高的精度。如果您需要更多,您可能必须使用字符串。
于 2010-11-05T15:02:55.017 回答
0
是的,这是因为双精度有限。有许多不同的方法来计算 pi 的位数。我建议询问您最喜欢的搜索引擎“如何计算 pi 的位数”。
于 2010-11-05T15:00:01.070 回答
0
您可以按照此答案中的建议使用 J#BigDecimal
类型。
于 2010-11-05T15:01:49.300 回答