C 如何在使用pow函数时避免-nan(ind)错误。有没有可能将pow与非整数指数的负基一起使用
使用pow功能时出现错误C 如何在使用pow函数时避免-nan(ind)错误。有没有可能将pow与非整数指数的负基一起使用,c,debugging,math,pow,C,Debugging,Math,Pow,使用pow功能时出现错误-nan(ind)打印到屏幕上。想知道是否有一种方法可以将pow用于基数为负数和非整数指数的数字 目前,pow函数为pow(-12.4112021858,0.2)。并给我-nan(ind)错误。 如果我把基数改为12.41,它的计算结果似乎很好 编辑-我已将指数设置为不同的数字0.2 int main() { double a = 1.83; double v = 1.25; double r = 0; double sum = 0
-nan(ind)
打印到屏幕上。想知道是否有一种方法可以将pow用于基数为负数和非整数指数的数字
目前,pow函数为pow(-12.4112021858,0.2)。并给我-nan(ind)错误。
如果我把基数改为12.41,它的计算结果似乎很好
编辑-我已将指数设置为不同的数字0.2
int main() {
double a = 1.83;
double v = 1.25;
double r = 0;
double sum = 0;
double exponent = 0.2;
double result = 1;
while (true)
{
printf("Enter Radius \n");
scanf_s("%lf", &r);
sum = 1 - r/ a;
printf("%lf\n", sum);
sum = sum * v;
printf("%lf\n", sum);
sum= pow(sum, exponent);
printf("%lf\n", sum);
}
}
想知道是否有一种方法可以将pow用于基数为负数和非整数指数的数字
首先,检查文档。C 2018 7.12.7.4规定了powf
、pow
和powl
:
pow
函数计算x
提升到y
的幂次。如果x
为有限且为负,而y
为有限且不是整数值,则会发生域错误
您的x
,大约−12.4112021858是有限的和负的,而您的y约为.2,是有限的,不是整数值。因此出现了一个域错误
这意味着您不能期望得到结果,除非您正在使用的pow
专门为超出C标准要求的其他情况提供支持,即使.2在double
中准确表示
(当出现域错误时,将返回一个实现定义的结果。这可能是一个NaN,一个有效的数学结果,例如−如果使用基于十进制的浮点或其他方法,则为pow(-32.2)
。实现也可能通过errno
或浮点异常报告错误。有关更多信息,请参阅C 2018 7.12.1。)
其次,.2不能用大多数C实现的double
格式表示。C实现通常使用IEEE-754二进制64格式。在此格式中,与.2最接近的可表示值为0.20000000000111022302462515654023631668090908203125。对于源代码pow(-12.4112021858.2)
,首先将数字转换为double
,然后使用参数-12.4112021858000005631328989576692581767578125和
0.200000000000000011102230246251565404236316680908203125. 因此,您没有请求具有实数结果的操作
如果您的C实现使用了基于十进制的浮点,.2是可表示的,pow(-12.4112021858,.2)
返回x的第五个根是合理的,因为第五个根是负实数。(如上文所述,这将是对pow
标准规范的扩展。)
如果您知道y
应该是五分之一或有理数p/q,其中q是奇数,您可以计算期望的结果为pow(fabs(x),y)
如果p是偶数和copysign(pow(fabs(x),y),x)
如果p是奇数
其中一条注释建议使用cpow
,但这不会产生您想要的结果<代码>cpow(-12.4112021858.2)
将返回大约1.3388±0.9727 i。(复幂“函数”是多值函数,但定义了cpow
以产生该结果。)
想知道是否有一种方法可以将pow用于基数为负数和非整数指数的数字
首先,检查文档。C 2018 7.12.7.4规定了powf
、pow
和powl
:
pow
函数计算x
提升到y
的幂次。如果x
为有限且为负,而y
为有限且不是整数值,则会发生域错误
您的x
,大约−12.4112021858是有限的和负的,而您的y约为.2,是有限的,不是整数值。因此出现了一个域错误
这意味着您不能期望得到结果,除非您正在使用的pow
专门为超出C标准要求的其他情况提供支持,即使.2在double
中准确表示
(当出现域错误时,将返回一个实现定义的结果。这可能是一个NaN,一个有效的数学结果,例如−如果使用基于十进制的浮点或其他方法,则为pow(-32.2)
。实现也可能通过errno
或浮点异常报告错误。有关更多信息,请参阅C 2018 7.12.1。)
其次,.2不能用大多数C实现的double
格式表示。C实现通常使用IEEE-754二进制64格式。在此格式中,与.2最接近的可表示值为0.20000000000111022302462515654023631668090908203125。对于源代码pow(-12.4112021858.2)
,首先将数字转换为double
,然后使用参数-12.4112021858000005631328989576692581767578125和
0.200000000000000011102230246251565404236316680908203125. 因此,您没有请求具有实数结果的操作
如果您的C实现使用了基于十进制的浮点,.2是可表示的,pow(-12.4112021858,.2)
返回x的第五个根是合理的,因为第五个根是负实数。(如上文所述,这将是对pow
标准规范的扩展。)
如果您知道y
应该是五分之一或有理数p/q,其中q是奇数,您可以计算期望的结果为pow(fabs(x),y)
如果p是偶数和copysign(pow(fabs(x),y),x)
如果p是奇数
其中一条注释建议使用cpow
,但这不会产生您想要的结果<代码>cpow(-12.4112021858.2)
将返回大约1.3388+.97
mypow(-12.411202,0.200000) = -1.654866
a^(b0+1/b1) = a^b0 * a^(1/b1)
mypow(-12.41120243,3.200000) = 3163.76635742
mypow(3163.76635742,0.312500) = 12.41120243