编译器计算不正确?

时间:2018-05-16 02:56:22

标签: c++11

我试图创建一个反向打印数字的简单程序,我有这两个函数:

void get_numbas(int numbah){

    for(int i = 1; i <= 5; i++){
        step1 = numbah % (int)pow(10,i);
        step2 = step1/(int)pow(10,i-1);
        std::cout << step2;
    }
}

我对第二个函数的输入是12345,在第二次迭代中,step1应该变成45,我已在主要测试

int test = 12345; 
int step1 = test % (int)pow(10,2); //45

但是当我调试时,在第二次迭代中,我看到step1变为69(我不知道为什么)。所以我的输入是12345,它应该将其反转为54321,但是由于在第二次迭代时这种笨拙的错误计算,它打印56321(因为它使用69 / 10而不是45/10)。有没有人知道发生了什么?

SCREENSHOT OF MY OUTPUT

1 个答案:

答案 0 :(得分:1)

pow是一个浮点函数。浮点存在固有的不准确性。 pow(10,5)的结果可能会变成9999.999999837204183或类似的结果。然后你的代码向下舍入(而不是舍入到最接近的整数),产生一个意想不到的结果。

这解释了您在第二次迭代中对69的观察,因为12345 % 99给出了69

我建议重新设计基于整数的代码,以便不使用中间浮点运算,例如: :

 uint32_t dividend = 1;

 for(int i = 1; i <= 5; i++)
 {
    step1 = numbah % (dividend * 10);
    step2 = step1 / dividend;
    dividend *= 10;
    std::cout << step2;
}