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

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