C语言 sqrt函数的一个疑问
来源:百度知道 编辑:UC知道 时间:2024/05/09 10:23:42
long a=53258,b=4098;
printf("\nsqrt:%g",sqrt((a-b)*(a-b)));
而输出为sqrt:DOMAIN error
sqrt:-NAN
但
long a=40000;
printf("\nsqrt:%g",sqrt(a*a));
输出正常:sqrt:40000
printf("\nsqrt:%g",sqrt((a-b)*(a-b)));
而输出为sqrt:DOMAIN error
sqrt:-NAN
但
long a=40000;
printf("\nsqrt:%g",sqrt(a*a));
输出正常:sqrt:40000
long为32位整型数
2^32 > (53258-4098)*(53258-4098) > 2^31
所以(53258-4098)*(53258-4098)的结果相当于一个负数
对一个负数开平方自然会DOMAIN error
改成long double就可以了
这样试试
long double a=53258,b=4098;
printf("\nsqrt:%g",sqrt((a-b)*(a-b)));
我可以得到结果49160