C++ 将方程的值赋给变量有问题吗
方程值分配给变量(循环内的第二行)的值始终小于1-仅在第一次迭代中-尽管方程(循环内的第一行)本身计算良好 我正在Windows机器上使用MinGW编译器、codeLite软件C++ 将方程的值赋给变量有问题吗,c++,C++,方程值分配给变量(循环内的第二行)的值始终小于1-仅在第一次迭代中-尽管方程(循环内的第一行)本身计算良好 我正在Windows机器上使用MinGW编译器、codeLite软件 #include <iostream> #include <cmath> #include <vector> int main(){ std::vector<int> elements_of_num {5, 0, 3}; size_t power = 2;
#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;
}
#包括
#包括
#包括
int main(){
向量元素{5,0,3};
尺寸/功率=2;
int n{0};
for(int-el:elements-of-num){
std::cout对于这些值,您的pow实现似乎不准确。通过强制使pow(10,power)
不准确,我成功地获得了与您相同的结果
对于代码中的第一个变体:
(请注意,由于原始代码打印的数字精度较低,因此您会误以为表达式的结果为500。但是,实际值稍小)
对于第二行代码:
n = n + el * pow(10, power);
499.999999 49999995578
被分配给一个int
变量,截断分数,留下499。之后一切都变糟了
注:
我不认为这是如何实现<代码> POW(10, 2)< /C> >,理论上可以使用ELN(10)*2来实现,这引入了不精确性,而且C++不强制IEEE 754一致性,这意味着POW(102)在某些系统上可能不准确,并会像您的情况一样,向下或上下小错误。
解决方案:
根本不要使用pow
,或者使用round(pow(10,功率))
。在您的情况下,最好使用常规整数乘以10。您的环境出了问题,而不是您的代码。预期结果是:500、500、500、503、503.,,…使用pow
从这样的数字计算值是个坏主意。只需反向迭代,然后使用n=n*10+el
w这要快得多
std::cout.precision(20);
std::cout << n + el * pow(10, power) << std::endl;
499.99999499999995578
n = n + el * pow(10, power);