【发布时间】:2020-08-21 17:55:28
【问题描述】:
我需要计算 pi 直到第 15 位,但我的函数冻结了。我使用这个泰勒系列:
atan(x) = \sum_{n=0}^\infty \frac{(-1)^{n} \cdot x^{2n + 1}}{2n + 1}
而 x 等于 1。
还有我的功能:
public static decimal Pi()
{
decimal curr = 4m,
prev = 0m,
one = -1m,
den = 3.0m;
while (Math.Abs(curr - prev) > 1e-15m)
{
prev = curr;
curr += 4.0m * one / den;
one = -one;
den += 2.0m;
}
return curr;
}
我已经调试过了,但我没有找到原因。链接到REPL
【问题讨论】:
-
decimal用于精确表示以 10 为底的数字,而不能以固定精度以 2 为底表示的数字。你代表的是无理数,所以你真的不应该在这里使用它。它比以 2 为底的浮点数要慢 很多。 -
另外,当你只使用条件时,为什么要使用
for循环而不是while循环? -
@Servy,是的,while 循环更好 :) 我不知道为什么我在这种情况下使用 for 循环。
-
@Servy,我使用
decimal类型来计算欧拉数,但我的函数没有冻结。 -
尝试跟踪迭代次数并使用较小的 epsilon(如 1e-2 然后 1e-3)并注意迭代次数为 2*10^n 其中 n 是精度位数您在 epsilon 中使用。因此,对于 15,它是 2,然后是 15 个零迭代。好多啊。如果每次迭代需要一纳秒,那将需要大约 23 天。或者,如果每一个都需要 1 个滴答声,它仍然需要 5 个多小时才能完成。
标签: c# numerical-methods