C语言中调用pow()函数,结果莫名少1

时间:2021-07-11 02:05:44
题目:有等式[※×(※3+※)]^2=8※※9,其中※处为1个数字,滴上了墨水无法辨认。请编程找出※表示哪个数字。
代码:
#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));

#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));

#5


确实是的,整数运算很有限,不应该使用数学库的 .