C++ 为什么pow函数给我nan作为答案?

C++ 为什么pow函数给我nan作为答案?,c++,C++,我有一个程序,读取5个整数,然后用这些数字给出各种计算的结果。我在计算几何平均数时特别困难。我知道你应该把这些数字相乘,然后取结果的第n个根 我的代码如下(假设所有#include和main方法都正确): intnum1、num2、num3、num4、num5; cout>num1>>num2>>num3>>num4>>num5; 双gMean=功率((num1*num2*num3*num4*num5),(1.0/5.0)); cout一个双人间所能储存的东西太多了。数字太大,导致您输入的双倍数

我有一个程序,读取5个整数,然后用这些数字给出各种计算的结果。我在计算几何平均数时特别困难。我知道你应该把这些数字相乘,然后取结果的第n个根

我的代码如下(假设所有#include和main方法都正确):

intnum1、num2、num3、num4、num5;
cout>num1>>num2>>num3>>num4>>num5;
双gMean=功率((num1*num2*num3*num4*num5),(1.0/5.0));

cout一个双人间所能储存的东西太多了。数字太大,导致您输入的双倍数字溢出

此外,您还可以根据错误期间发生的一些事件检查这些问题,如以下文档所述:


为清晰起见进行了编辑:pow()将一个double作为输入,因此当您将所有这些int相乘时,当结果被类型转换为double时,可能会导致溢出。此外,数学本身也可能导致溢出。

pow(x,y)
的手册页:

所以看起来像是您案例中的第一个案例。

要(可能)避免溢出,请重新编写为

double gMean = pow(num1, (1.0/5.0)) *
               pow(num2, (1.0/5.0)) *
               pow(num3, (1.0/5.0)) *
               pow(num4, (1.0/5.0)) *
               pow(num5, (1.0/5.0)) 

问题不在电源中。表情

num1 * num2 * num3 * num4 * num5
这本身就是罪魁祸首。如果在调试器中查看结果值,可能会看到一些无意义的负值。这就是导致
pow
失败的原因。如果第一个参数为负,而第二个参数不是整数,则If失败并出现域错误

85、43、95、100和78的产品不符合平台上的
int
范围。它溢出并导致未定义的行为。这就是你观察到的

将该表达式的值计算为

(double) num1 * num2 * num3 * num4 * num5

而你的
pow
应该会给出一个更有意义的结果。

你例子中的数字会导致未定义的行为,因为它们溢出了
int
。你能找到
errno
在调用
pow
的行之后,即
cout
之前包含的内容吗?您应该能够简单地打印它。我想知道是否故意选择示例输入来突出这个潜在问题?您可能是指
int
,而不是
double
?很难把双倍的水溢出来
85*43*95*100*78
介于
2^31
2^32
之间,这会导致一个负的
int
(在传递到
pow
之前,它会被转换成
double
,但它没有帮助,因为它已经是负的了),但是有可能传入如此大的值,以至于它们在pow()开始进行指数计算之前抛出异常。
num1 * num2 * num3 * num4 * num5
(double) num1 * num2 * num3 * num4 * num5