将方程式的值分配给变量出了点问题

时间:2019-04-13 14:47:35

标签: c++

尽管仅由方程式(循环内的第一行)计算得很好,但仅将方程式的值分配给变量(循环内的第二行)总是小于1-仅在第一次迭代时。 / p>

我正在Windows计算机上使用MinGW编译器,codeLite软件。

#include <iostream>
#include <cmath>
#include <vector>

int main(){
    std::vector<int> elements_of_num {5, 0, 3};
    size_t power = 2;
    int n {0};
    for(int el: elements_of_num){
        std::cout << n + el * pow(10, power) << std::endl;
        n = n + el * pow(10, power);
        std::cout << n << std::endl;
        power--;
    }
    std::cin >> n;
    return 0;
}
  

预期结果:{500,500} {499,499} {503,503}

     

实际结果:{500,499} {499,499} {502,502}

1 个答案:

答案 0 :(得分:1)

对于这些值,您的pow实施似乎不准确。通过强制使pow(10, power)不正确,我设法获得了与您相同的结果。

对于您代码中的第一个变体:

std::cout << n + el * pow(10, power) << std::endl;

表达式的值略小于500。您可以通过以下方式进行验证:

 std::cout.precision(20);
 std::cout << n + el * pow(10, power) << std::endl;

我怀疑这会打印出类似的内容

499.99999499999995578

(请注意,由于原始代码以较低的精度打印数字,所以您会误以为该表达式的结果为500。但是,实际值会略小)。

对于第二行代码:

n = n + el * pow(10, power);

499.99999499999995578分配给一个int变量,将其截断并剩下499。之后一切都向南。

注意:

我不认为IEEE 754指示应如何实施pow(10, 2),并且从理论上讲,可以使用e ln(10)* 2 来实现,错误。而且,C ++并没有要求IEEE 754一致性。这意味着pow(10,2)在某些系统上可能不准确,并且会像您所遇到的情况一样使向上或向下产生一个小错误。

解决方案:

完全不要使用pow,否则请使用round(pow(10, power))。在您的情况下,最好将正整数乘以10。