C 如何在使用pow函数时避免-nan(ind)错误。有没有可能将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

使用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;
 
    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