#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,还有一些其他的数也是。
是精度问题,但光改成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.
#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"); }