C 计算欧拉数的精度低于预期

标签 c floating-point

这段代码是我写的。我认为这没问题,但当我运行它时,我得到了一个糟糕的结果。该代码用于计算欧拉数。我将感谢您的回答。

我期望的结果大约是 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 位整数来说太大。因此你有溢出,结果是完全错误的。

如果 factorialdouble 或 64 位整数而不是 int,您可能会得到一些不错的结果。

您的计算给您带来的(相对较小的)错误是由于使用 float 而不是 double 来表示 totaldivision:

我们将 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/

相关文章:

c++ - 从内存中绘制位图

c - 当我尝试登录网站时,什么 IP 地址被阻止?

c - C中使用按位运算符的两个数字的最大值

.net - 处理 .NET 中的浮点错误

python - 分数背后的重要原因(0.1) = 3602879701896397/36028797018963968

java - "Less than or Equal to"与 "Less than"进行处理

c - 在树中查找特定值

python - 如何在 python 中将 float 转换为 timedelta 秒?

c++ - 当 float 变量超出 float 限制时,会发生什么?

ios - 如何在 swift 中将字节转换为浮点值?