提问者:小点点

C++给出的输出值为1


下面是我的代码:

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);

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


共2个答案

匿名用户

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

但是,C++标准允许pow给出一个近似,超出了双精度浮点算术中常见的近似。 在某些标准(如IEEE754)下,要求某些函数(如sqrt)和算术运算符返回尽可能最佳的浮点数,但该规则不适用于pow。 它允许编译器和C++标准库供应商懒惰地将pow(x,y)实现为exp(y*log(x))。 这可能会低于正确的值,而截断为整型则会使问题变得非常严重。

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

pow结果周围放置std::round可能会起作用。

匿名用户

如果您必须滚动自己的文本到整数转换,则可以简单得多:

const int base = 5;
int oupt = 0;
for (int i = 0; i < number.length(); ++i) {
    oupt *= base;
    oupt += number[i] - '0'; // works for all character encodings
}

std::string output = std::to_string(oupt);

注意:不使用或不需要浮点数学。

但是使用标准库更容易:

int oupt = std::stoi(number, nullptr, base);

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|给出|输出|值)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?