C语言中关于x!=sqrt(x)*sqrt(x)的问题

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
main()
{ float x,y,k;
scanf("%f",&y);
x=sqrt(y);//数学中X=Y,但是实际中C语言对小数位是有控制的,数学中小数的位数理论上可以无限
printf("%f\n",x);
k=x*x;
printf("%f\n",k);
system("pause");
}

有的时候输19,可以得到19.0004这些不能于原来的数的数据,但是有的数我输入53,给我的答案是53.000却是等于原数了,我把我的想法注释在程序里的注释行里,我这样想的:
一个不能完全开方的数,它的小数位是有限的,不可能无限多,这样推论,不能完全 开放的数a,sqrt(a)*sqrt(a)一定是不等于a的,可是为什么53输入却是得到53.000000,还有一些其他的数也是。
最新回答
青春明媚╮仍带伤

2024-11-22 14:51:20

是精度问题,但光改成double也不能完全避免问题的发生.
要注意的是,浮点数的比较不能直接用运算符作用于两数,比如a==b,即使a和b在理论上算出来应该是相同的,而应该用fabs(a-b)<=一个很小的数(比如1e-6),来判断a,b是否相等.

实际上,在编程中,因为浮点数有位数限制,所以对于任何不能完全开平方的数来说,sqrt(x)*sqrt(x)都是<x的.因为如果x不能完全开方,那么sqrt(x)必然是无理数,小数部分是无限位的,而计算机只能保留一部分,所以计算机保留的值是近似等于sqrt(x),但又比sqrt(x)略小,所以理论上sqrt(x)*sqrt(x)<x,但使用double后,这个sqrt(x)*sqrt(x)和x的差值很小,有时候四舍五入的结果又正好等于x.00000.....这样,比如你试的53.
那么没心没肺

2024-11-22 08:15:15

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
int main()
{
double x,y,k;// float 有精度问题,改成使用double 就可以了
scanf("%lf",&y);
x=sqrt(y);
printf("%lf\n",x);
k=x*x;
printf("%lf\n",k);
system("pause");
}