当 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
这意味着当 res
和 res_old
的值都为 inf
.
时循环结束
补充说明:
在 func_e
中,您使用 double k;
并将其传递给 double fak(int n)
,后者将值转换为 int
。函数 fak
在 int
中进行计算,并在 return
语句中将结果隐式转换为 double
。
我建议避免这些转换。 (或至少考虑可能出现的问题。)如果您启用所有警告,编译器可能会对此发出警告。
我尝试实现此代码并且它在一定程度上有效 (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
这意味着当 res
和 res_old
的值都为 inf
.
补充说明:
在 func_e
中,您使用 double k;
并将其传递给 double fak(int n)
,后者将值转换为 int
。函数 fak
在 int
中进行计算,并在 return
语句中将结果隐式转换为 double
。
我建议避免这些转换。 (或至少考虑可能出现的问题。)如果您启用所有警告,编译器可能会对此发出警告。