我正在写一个函数来计算PI的值,并将其作为双精度值返回。到现在为止还挺好。但是,一旦函数在小数点后达到14位数,它就不能再保留了。我假设这是因为双精度有限。我应该怎么做才能在小数点后继续获得更多数字?C#高双精度
Q
C#高双精度
5
A
回答
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框架提供),您可以轻松计算出分子和分母的大小。那么你只是将商数转换为十进制的问题。那很容易。据推测你知道如何做长分区。只需在分子和分母上实施一个长分割算法,即可得出所需数量的数字。
8
你需要多少精度?
使用decimal
会给你大约28位小数:
decimal pi = 3.14159265358979323846264338327950288419716939937510m;
Console.WriteLine(pi); // 3.1415926535897932384626433833
如果这还不够你,那么你就需要寻找某种BigDecimal的实现,或者看看其他技术进行计算。
0
是的,这是因为双精度有限。有很多不同的方法来计算pi的数字。我会建议问你最喜欢的搜索引擎,“如何计算pi的数字”。
0
您可以使用J#BigDecimal
类型,如this answer中所建议的那样。
1
1
尝试decimal
而不是双倍。它不能存储大到双倍的数字,但我认为小数点后的精度更高。如果你需要更多,你可能不得不使用一个字符串。
相关问题
- 1. 输出精度高于双精度
- 2. 高功率和双精度
- 3. C++使用长双精度使用双精度
- 4. 精度双Objective-C中的
- 5. 双精度值
- 6. 双精度?
- 7. IEEE双精度
- 8. 为什么java.awt.Dimension对高度和宽度使用双精度?
- 9. 双精度和单精度浮点数?
- 10. 双精度丢失
- 11. Java的双精度
- 12. 双精度混淆?
- 13. 在JAVA双精度
- 14. Postgres的双精度
- 15. 蜂巢 - 双精度
- 16. C++测试双精度是否为#INF
- 17. c中的浮点数和双精度#
- 18. C中无符号双精度?
- 19. 在C++中减少双精度范围
- 20. DirectShow - 将IGraphBuilder *转换为双精度(C++)
- 21. C#精度损失除以双
- 22. 如何保持双的精度在C++
- 23. Objective-C浮点数/双精度
- 24. SQL C#双精度小数点
- 25. C#,将Npoi.ICell转换为双精度型
- 26. C#十进制和双精度
- 27. 如何转换黑莓中的双精度双精度?
- 28. 功能科尔(双精度,双精度)不存在 - PostgreSQL的
- 29. 双精度浮点值传递双精度时
- 30. 无法将双精度转换为双精度
我不会使用字符串 - 你会有额外的开销转换为/从数字。 – JLWarlow 2010-11-05 15:13:30
是的,但是如果你需要比呃更高的28位精度,那么就没有内置的数据类型。 IIRC C#确实有一些类的值(几乎)无限大小,我很确定它会将它们作为字符串内部存储... – user472875 2010-11-05 15:20:24
...或一个字节数组。 – 2010-11-05 16:01:54