尽管仅由方程式(循环内的第一行)计算得很好,但仅将方程式的值分配给变量(循环内的第二行)总是小于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}
答案 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。