c++ - 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 的所有转换。请帮助我。
解决方案
任何不能为您double
提供带有整数参数的精确值的工具集都pow
应该被认为是有缺陷的。
但遗憾的是,C++ 标准允许pow
为您提供一个超出双精度浮点算术特有的近似值。在某些标准下 - 例如 IEEE754 - 一些函数(例如sqrt
)和算术运算符需要返回可能的最佳浮点数,但该规则不适用于pow
. pow(x, y)
例如,它允许编译器和 C++ 标准库供应商懒惰并实施exp(y * log(x))
。这可能会低于正确的值,并且截断为整数类型会使问题变得有害。
这就是发生在你身上的事情。
解决std::round
结果pow
可能会奏效。
推荐阅读
- snakemake - snakemake - 访问不在 bin/ 中的 conda 环境资产
- rust - Rust:从 std::Rc 智能指针向量实现迭代器
- snowflake-cloud-data-platform - 雪管:根据文档不保证负载顺序
- string - 如何在 Kotlin 中的所有数字之间插入空格?
- ios - Leaflet-locatecontrol 插件:ios 应用程序在运动和方向弹出权限上崩溃
- excel - 从 Onedrive 导入 CSV 文件 - Excel Web - Office 脚本
- reactjs - 我可以在图像标签内使用三元运算符吗?
- windows - GDB - 替代源路径
- android - 尝试在应用程序 Flutter/Dart 中保存最喜欢的按钮状态
- python - 正确使用 python unittest mock 的问题