C++ 将方程的值赋给变量有问题吗

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;

方程值分配给变量(循环内的第二行)的值始终小于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;
    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);