求解惑,一个关于浮点误差的问题。
输出所有形如aabb的四位完平方全数。
- C/C++ code
#include <stdio.h>#include <math.h>int main(){ int a,b,num; double m; for(a=1; a<=9; a++) for(b=0; b<=9; b++) { num=a*1100 + b*11; m=sqrt(num); if(floor(m+0.5)==m) //请注意此处 printf("%.d\n",num); }}//注释处到底是怎么运行的?
难道是先把浮点型转换为整形再和floor()比较?
[解决办法]
明确,5*5=25, 4*4!=25, 4.8*4.8!=25 5.2*5.2!=25 ,但是有一个问题就是sqrt(25.0)不一定等于5.0,可能是4.999,可能是5.001,怎么办? 如果是4.999的情况,+0.5进上去取整试一下即可。
如果是5.001的情况,+0.5取整试一下即可。没了。
所以就是+0.5试一下即可。
[解决办法]
浮点数存在误差,但是这个误差是极小的。
floor(m+0.5)这种方式可以将精度控制到整数位。