c++ - 编译器计算错误

标签 c++ mingw pow

我有这么大的作业,却得到了意想不到的结果,我追溯到下面的代码

for (int i = 0; i < 4; i++)
    cout << (int)((7163 / (int) pow (10, 4 - i - 1))) % 10;

屏幕上出现的是7263,而不是7163!这不会发生在每个 4 位数字上,这让我感到困惑,是我的逻辑有问题还是编译器疯了。有什么解决办法吗?

最佳答案

这里的问题不在于编译器,而在于 pow 函数的标准库实现。

但是确实不建议使用(int)(pow(n, k))来计算nk 两个整数。

pow 不能保证产生准确的答案;它可能会很少。 (实际上,它的准确性根本无法保证,但大多数实现会尽量避免错误超过结果低位的值。)由于转换为 (int) 截断而不是四舍五入,即使是很小的错误也会导致结果偏离 1。在这种情况下,如果 pow(10,2) 的结果最终为 99.999999999999 ,然后将其转换为 int 将得到 99,而 7163/99 就是 72。

所以如果你坚持使用pow,你需要确保结果是rounded而不是截断的(参见round标准库功能)。但最好坚持整数运算。例如:

for (int i = 1000; i > 0; i /= 10)
  std::cout << 7163 / i % 10;

关于c++ - 编译器计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30534271/

相关文章:

c++ - 如何限制类在声明它的 namespace 之外的可见性?

c++ - Sublime Text 2 和 MinGW

c++ - 'to_string' 不是 'std' 的成员

python - 类型错误 : cannot convert the series to <class 'float' > using pow

java - 为什么这段代码使用 Math.pow 打印 "HELLO WORLD"?

C# ModPow -1 问题

c++ - 未使用模板继承在范围内声明变量

c++ - 如何从另一个类参数访问类构造函数参数

无法使用 MinGW 编译 C 代码

c++ - 在这里进行位移有什么意义?