这段代码是我写的。我认为这没问题,但当我运行它时,我得到了一个糟糕的结果。该代码用于计算欧拉数。我将感谢您的回答。
我期望的结果大约是 2.718281828459045,我得到的结果是 2.718281745910644:
- 2.718281828459045(预期)
- 2.718281745910644(实际)
代码:
#include <stdio.h>
main() {
int factor, counter, n = 1;
float total = 0, division;
while ( n <= 20 ) {
counter = 1;
factor = n;
while ( counter < n ) {
factor *= ( n - counter );
counter++;
}
division = 1.0 / factor;
total = total + division;
n++;
}
total = total + 1;
printf( "La constante matematica e vale aproximadamente: %.20f\n", total);
return 0;
} /* Finaliza funcion main */
最佳答案
while ( n <= 20 ) {
contador = 1;
factorial = n;
while ( contador < n ) {
factorial *= ( n - contador );
contador++;
}
// snip
n++;
int
,如果是32位整数类型,最多只能保存12!
的阶乘。 13! = 6227020800
对于 32 位整数来说太大。因此你有溢出,结果是完全错误的。
如果 factorial
是 double
或 64 位整数而不是 int
,您可能会得到一些不错的结果。
您的计算给您带来的(相对较小的)错误是由于使用 float
而不是 double
来表示 total
和 division
:
我们将 e
计算为 double
的良好近似值
Prelude Text.FShow.RealFloat> FD $ exp 1
2.718281828459045090795598298427648842334747314453125
并将其转换为 float
:
Prelude Text.FShow.RealFloat> FF $ realToFrac it
2.71828174591064453125
这是您得到的值:2.718281745910644
对打印中的不同精度取模。这与我们将 exp 1
计算为 float 时得到的结果相同:
Prelude Text.FShow.RealFloat> FF $ exp 1
2.71828174591064453125
最接近所需结果的浮点
值:
Prelude Text.FShow.RealFloat> FF 2.718281828459045
2.71828174591064453125
关于C 计算欧拉数的精度低于预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13885182/