当 x 大于 0.6 时,函数 e^x returns 'inf' 作为输出

Function e^x returns 'inf' as output when x is larger then 0.6

我尝试实现此代码并且它在一定程度上有效 (x<0.6)。我只是想知道为什么它会输出 'inf' 尽管停止标准应该在程序达到最大精度 double 时终止程序。

#include <stdio.h>
#include <math.h>

double fak(int n) {
    int f = 1;
    int i = 0;
    
    do {
        i++;
        f *= i;
    } while(i<n);
    
    return f;
}

double func_e() {
    double res = 0;
    double res_old = 0;
    double x, k;
    x = 1;
    k = 0;
    
    do {
        res_old = res;
        res += ((pow(x,k)) / fak(k));
        k++;
    } while(res != res_old);
    
    return res;
}

int main(void) {
    //printf("power %f", pow(3,3));
    
    printf("%f", func_e());
    //printf("%f", fak(3));
    
    printf("\n");
    return 0;
}

检查函数 fak 的 return 值。它会溢出并在某个点 return 0。除以 0.0 结果是 inf.

当我将函数fak修改为

double fak(int n) {
    int f = 1;
    int i = 0;
    
    do {
        i++;
        f *= i;
    } while(i<n);
    
    printf("fak(%d) = %d\n", n, f);
    return f;
}

和运行它在https://onlinegdb.com/ZxaXfI5xcG上,输出是

fak(0) = 1
fak(1) = 1
fak(2) = 2
fak(3) = 6
fak(4) = 24
fak(5) = 120
fak(6) = 720
fak(7) = 5040
fak(8) = 40320
fak(9) = 362880
fak(10) = 3628800
fak(11) = 39916800
fak(12) = 479001600
fak(13) = 1932053504
fak(14) = 1278945280
fak(15) = 2004310016
fak(16) = 2004189184
fak(17) = -288522240
fak(18) = -898433024
fak(19) = 109641728
fak(20) = -2102132736
fak(21) = -1195114496
fak(22) = -522715136
fak(23) = 862453760
fak(24) = -775946240
fak(25) = 2076180480
fak(26) = -1853882368
fak(27) = 1484783616
fak(28) = -1375731712
fak(29) = -1241513984
fak(30) = 1409286144
fak(31) = 738197504
fak(32) = -2147483648
fak(33) = -2147483648
fak(34) = 0
fak(35) = 0
inf

这意味着当 resres_old 的值都为 inf.

时循环结束

补充说明:

func_e 中,您使用 double k; 并将其传递给 double fak(int n),后者将值转换为 int。函数 fakint 中进行计算,并在 return 语句中将结果隐式转换为 double

我建议避免这些转换。 (或至少考虑可能出现的问题。)如果您启用所有警告,编译器可能会对此发出警告。