【发布时间】:2013-08-08 20:29:41
【问题描述】:
我编写了一个计算 Pi 的程序。
它使用double 类型,因此在这种情况下它自然只会将 Pi 计算到最多 16 位小数。
我正在尝试让我的代码采用BigDecimals 类型,以便我可以将 Pi 计算为更精确的数字(即更多小数位)。
我的进度可以看到>> here <<
我正在使用Madhava–Leibniz series 来计算 Pi:
Pi = 4/1 + (-4/3) + 4/5 + (-4/7) + 4/9 + ... + 4/n
在我的程序中,我做了这样的划分:
currentTerm=(double)-4/oddTerm;
在我更新的代码中,我已将其更改为:
currentTerm = neg.divide(oddTerm, 10, RoundingMode.HALF_UP);
我希望这能给你一个想法或正在发生的事情。
我的问题是,在此示例中,RoundingMode 的哪个 Enum Constant 将是最好使用的(或更准确的?)... 显然,如果我使用不同的输出,Pi 的输出会发生显着变化。 以下是完整列表:
另外,我是否正确使用10 的scale 进行此计算以获得最精确?
谢谢。
编辑
将Scale 更改为 100;给 Pi 100dp。等等
【问题讨论】:
-
我不知道你为什么使用
scale=10,使用 BigDecimal 的比例是任意的,你也可以使用 20 或 100 并获得更高的精度(当然,它会更慢) .关于四舍五入,我会选择 HALF_EVEN,它没有系统偏差。无论如何,由于您正在总结替代符号的术语,我猜 HALF_DOWN 或 HALF_UP 应该执行几乎相同。 -
感谢您的评论。此后,我将 Scale 更改为 100(因为直到几分钟前我才确定自己做了什么)。 Scalee 100 给了我 100dp 的 Pi。我想我会坚持使用 HALF_UP,尽管我在质疑我的数学,因为我的程序给出了
3.14149265359...,并且我在 google Pi 上发现计算为 100dp 为3.14159265358...我假设这与舍入有关.. .? -
您知道莱布尼茨级数收敛非常缓慢,是吗? en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80
-
是的,我知道它的收敛速度不如其他方法/系列,但我认为它是最容易开始的。如果我能达到对程序感到满意的程度,我将探索其他算法:) 我的程序使用 5000 个术语为 Pi 提供以下 1000dp:
3.1413926535917932383626433954795001141981798188345532196965187625458916006334194979629989247706731687102838238398361791574536367663058247375248339681750209539995182762289282761350508360315226843520701417644166609500807057357095090492110090220309058886968823519731751091437...对我来说看起来不正确...... -
哦...我刚刚阅读了维基页面的
Inefficiency部分。这解释了为什么它是3.14139...而不是3.14159...感谢您强调这一点。我想我的数学是正确的毕竟(将收敛速度放在一边)