C 中的 sqrt 函数打印 -nan
sqrt function in C prints -nan
在做一些代码练习时,
我观察到由 sqrt 函数引起的异常输出,
代码是,
#include<stdio.h>
#include<math.h>
int main()
{
double l,b,min_r,max_r;
int i;
scanf("%lf %lf",&b,&l);
printf("%lf %lf\n",sqrt(l*l+b*b),sqrt(b*b-l*l));
return(0);
}
输出:
4 5
6.403124 -nan
为什么会这样。
看看数字:b
是 4,l
是 5。所以 b*b - l*l
是 -9。 -9 的平方根是多少?这是一个虚数,但是 sqrt
不支持虚数结果,所以结果是 nan(不是数字)。这是域错误。解决方案:不要将否定参数传递给 sqrt
.
在您的情况下,未验证输入会导致问题。
sqrt(b*b-l*l)
将 b
设为 4,将 l
设为 5 会产生一个 -ve 数字,这很可能是您不想要的。
FWIW,负数的根需要表示虚部。
在做一些代码练习时, 我观察到由 sqrt 函数引起的异常输出,
代码是,
#include<stdio.h>
#include<math.h>
int main()
{
double l,b,min_r,max_r;
int i;
scanf("%lf %lf",&b,&l);
printf("%lf %lf\n",sqrt(l*l+b*b),sqrt(b*b-l*l));
return(0);
}
输出:
4 5
6.403124 -nan
为什么会这样。
看看数字:b
是 4,l
是 5。所以 b*b - l*l
是 -9。 -9 的平方根是多少?这是一个虚数,但是 sqrt
不支持虚数结果,所以结果是 nan(不是数字)。这是域错误。解决方案:不要将否定参数传递给 sqrt
.
在您的情况下,未验证输入会导致问题。
sqrt(b*b-l*l)
将 b
设为 4,将 l
设为 5 会产生一个 -ve 数字,这很可能是您不想要的。
FWIW,负数的根需要表示虚部。