代码:
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c,temp,left;
for(a=1;a<=9;a++){
for(b=1;b<=9;b++){
for(c=0;c<=9;c++){
temp=a*((b*10+3)+c);
left=pow(temp,2);
if(left/1000==8&&left%10==9){
printf("%d %d %d %d %d\n",a,b,c,left/100-left/1000*10,left/10-left/100*10);
}
}
}
}
return 0;
}
结果单步执行时当temp=13,15,20,21,22,23..时(起始13)对应的left都少1,而其他数(14,16,17,18,...)都正常,这是为什么呢?
而且编译时没有给出ERROR和WARNING,按道理pow()返回类型是float,不应该给出warning吗?
5 个解决方案
#1
像这种平方的,就直接 temp * temp 了吧,何必去调用 pow
#2
用pow函数后结果转整型会有精度损失,应该直接用
left = temp * temp;
#3
自己封装一个pow就OK
#4
出个馊主意:
left=pow(temp,2);
改为
left=(int)(0.1+pow((double)temp,2.0));
left=pow(temp,2);
改为
left=(int)(0.1+pow((double)temp,2.0));
#5
确实是的,整数运算很有限,不应该使用数学库的 .
#1
像这种平方的,就直接 temp * temp 了吧,何必去调用 pow
#2
用pow函数后结果转整型会有精度损失,应该直接用
left = temp * temp;
#3
自己封装一个pow就OK
#4
出个馊主意:
left=pow(temp,2);
改为
left=(int)(0.1+pow((double)temp,2.0));
left=pow(temp,2);
改为
left=(int)(0.1+pow((double)temp,2.0));
#5
确实是的,整数运算很有限,不应该使用数学库的 .