计算C中双变量的最大值时出错

计算C中双变量的最大值时出错,c,debugging,double,limits,C,Debugging,Double,Limits,我在这里遵循了解决方案:并且无法计算double类型变量的最大值 我运行: double dbl_max = pow(2, pow(2, 10)) * (1-pow(2, -53)); printf("%.2e", dbl_max); Result: inf 或: 或: 为什么计算不适合变量?上面的顶部示例适用于浮点变量 中间指数太高。 将pow(2,10)更改为(pow(2,10)-1),然后 应该有用。您可以通过将最终结果乘以 2. -汤姆·卡泽斯 中间指数太高。将pow(2,10)更改

我在这里遵循了解决方案:并且无法计算double类型变量的最大值

我运行:

double dbl_max = pow(2, pow(2, 10)) * (1-pow(2, -53));
printf("%.2e", dbl_max);

Result: inf
或:

或:

为什么计算不适合变量?上面的顶部示例适用于浮点变量


中间指数太高。 将
pow(2,10)
更改为
(pow(2,10)-1)
,然后 应该有用。您可以通过将最终结果乘以 2. -汤姆·卡泽斯


中间指数太高。将
pow(2,10)
更改为
(pow(2,10)-1)
,它应该可以工作。您可以将最终结果乘以2进行补偿。不要使用
pow
计算2的幂。一个好的数学库会正确地处理这些问题,但并非所有的数学库都会-
pow
是一个浮点函数,质量一般的数学库会返回近似的结果。要在浮点运算中产生2的整数幂,请使用
ldexp(1,n)
表示
double
ldexpf(1,n)
表示
float
,其中
n
为整数。要生成整数中的二次幂,请使用
(type)1谢谢Elad。为什么中间指数太高?我认为计算应该完全符合变量。这与Eric所说的劣质数学库返回近似结果有关吗?
 double dbl_max = (pow(2, pow(2, 10)));
 printf("%.2e", dbl_max);

Result: inf
double dbl_max = pow(2, pow(2, 9)) * (1-pow(2, -53));
printf("%.2e", dbl_max);

Result: 1.34e+154
double dbl_max = pow(2, pow(2, 10)-1) * (1-pow(2, -53)) * 2;
printf("%.2e", dbl_max);