C ++模数返回错误的答案

时间:2015-11-12 13:02:48

标签: c++ codeblocks

这是我的代码:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int n, i, num, m, k = 0;
    cout << "Enter a number :\n";
    cin >> num;
    n = log10(num);

    while (n > 0) {
        i = pow(10, n);
        m = num / i;
        k = k + pow(m, 3);
        num = num % i;
        --n;
        cout << m << endl;
        cout << num << endl;
    }
    k = k + pow(num, 3);
    return 0;
}

当我输入111时,它会给我这个

1
12
1
2

我正在使用代码块。我不知道出了什么问题。

2 个答案:

答案 0 :(得分:2)

每当我使用pow期望整数结果时,我添加.5所以我使用(int)(pow(10,m)+.5)而不是让编译器自动将pow(10,m)转换为int。

我已经阅读了许多地方告诉我其他人已经对我添加.5的一些情况进行了详尽的测试,并发现零情况会有所不同。但是,准确地确定不需要它的条件可能非常困难。在不需要时使用它并没有真正的危害。

如果它有所作为,那就是你想要的差异。如果它没有什么区别,它的成本很低。

在发布的代码中,我会调整每次调用pow,而不仅仅是我用作示例的调用。

使用log10没有同样简单的解决方法,但可能会遇到同样的问题。由于您希望非整数答案和想要将非整数答案截断为整数,因此添加.5将是非常错误的。因此,您可能需要找到一些更复杂的工作来解决使用浮点的基本问题。我不确定,但假设32位整数,我认为在转换为1e-10之前将log10添加到int的结果中,这两者都不足以将log10(10^n-1)更改为log10(10^n)但始终足以纠正可能反过来的错误。

答案 1 :(得分:0)

pow执行浮点取幂。

浮点函数和操作是不精确的,你不能永远依赖它们来提供它们看似计算的精确值,除非你是专家IEEE浮点表示的精细细节以及库函数给出的保证。

(此外,浮点数甚至可能无法准确表示您想要的整数)

当您将结果转换为整数时,这尤其成问题,因为结果被截断为零:int x = 0.999999;设置x == 0,而不是x == 1。即使错误方向上最小的错误也会彻底破坏结果。

你可以舍入到最接近的整数,但这也有问题;例如如果数字足够大,您的浮点数可能没有足够的精度来接近您想要的结果。或者,如果您使用浮点数执行了足够的操作(或不稳定操作),则错误可能累积到您获得错误的最接近整数的点。

如果你想做精确,整数算术,那么你应该使用这样做的函数。例如编写自己的ipow函数来计算整数取幂,而不进行任何浮点运算。