我写了这段代码。我认为这是可以的,但是当我运行它时,我得到了一个糟糕的结果。此代码用于计算欧拉数。我将非常感谢你的回答。
我期望的结果大约是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 */
答案 0 :(得分:4)
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
计算为浮点数时,我们得到的结果相同:
Prelude Text.FShow.RealFloat> FF $ exp 1
2.71828174591064453125
与所需结果最接近的float
值:
Prelude Text.FShow.RealFloat> FF 2.718281828459045
2.71828174591064453125