首页 > 解决方案 > C++ 给出的输出差一

问题描述

这是我的代码:

int oupt=0;
for(int i=0, power=number.length()-1; i<number.length(); i++, power--) {
    oupt+=((int)number[i]-48)*pow(5, power);
}
string output = std::to_string(oupt);

在此,数字是我想从基数 5 转换为基数 10 的数字的字符串,例如“414”。当我运行代码时,当我知道答案为 109 时,我得到的答案为 108。对于所有其他基数5 它给出的输出减一。当我尝试打印 ((int)number[i]-48)*pow(5, power) 时,我得到有意义的输出,100、5、4。加起来是 109。我得到的输出是 108。这适用于从基数 5 到基数 10 的所有转换。请帮助我。

标签: c++

解决方案


任何不能为您double提供带有整数参数的精确值的工具集都pow应该被认为是有缺陷的。

但遗憾的是,C++ 标准允许pow为您提供一个超出双精度浮点算术特有的近似值。在某些标准下 - 例如 IEEE754 - 一些函数(例如sqrt)和算术运算符需要返回可能的最佳浮点数,但该规则不适用于pow. pow(x, y)例如,它允许编译器和 C++ 标准库供应商懒惰并实施exp(y * log(x))。这可能会低于正确的值,并且截断为整数类型会使问题变得有害。

这就是发生在你身上的事情。

解决std::round结果pow可能会奏效。


推荐阅读