我如何正确实现`operator /`?

时间:2011-06-17 02:58:19

标签: c++ math operator-overloading

主要编辑: 有人可以向我解释如何修复操作符/以使其正常工作吗?我意识到这种转变并不总是正确的,比如10 / 3,这将导致无限循环。那我怎么解决这个问题?

整个代码位于http://ideone.com/GhF0e

uint128_t operator/(uint128_t rhs){
    // Save some calculations ///////////////////////
    if (rhs == 0){
        std::cout << "Error: division or modulus by zero" << std::endl;
        exit(1);
    }
    if (rhs == 1)
        return *this;
    if (*this == rhs)
        return uint128_t(1);
    if ((*this == 0) | (*this < rhs))
        return uint128_t(0, 0);
    // //////////////////////////////////////////////
    uint128_t copyn(*this), quotient = 0;
    while (copyn >= rhs){
        uint128_t copyd(rhs), temp(1);
        // shift the divosr to match the highest bit
        while (copyn > (copyd << 1)){
            copyd <<= 1;
            temp <<= 1;
        }
        copyn -= copyd;
        quotient += temp;
    }
    return quotient;
}

这是正确的吗?

    uint128_t operator/(uint128_t rhs){
        // Save some calculations ///////////////////////
        if (rhs == 0){
            std::cout << "Error: division or modulus by zero" << std::endl;
            exit(1);
        }
        if (rhs == 1)
            return *this;
        if (*this == rhs)
            return uint128_t(1);
        if ((*this == 0) | (*this < rhs))
            return uint128_t(0);
        uint128_t copyd(rhs);
        // Checks for divisors that are powers of two
        uint8_t s = 0;
        while ((copyd.LOWER & 1) == 0){
            copyd >>= 1;
            s++;
        }
        if (copyd == 1)
            return *this >> s;
        // //////////////////////////////////////////////

        uint128_t copyn(*this), quotient = 0;
        copyd = rhs;
        uint8_t n_b = 255, d_b = 0;
        while (copyd){
            copyd >>= 1;
            d_b++;// bit size of denomiator
        }
        copyd = rhs;
        while (n_b > d_b){
            // get the highest bit of dividend at current step
            n_b = 0;
            uint128_t copycopyn(copyn);
            while (copycopyn){
                copycopyn >>= 1;
                n_b++;
            }
            uint8_t highest_bit = n_b - d_b - 1;
            copyn -= copyd << highest_bit;
            quotient += uint128_t(1) << highest_bit;
        }
        if (n_b == d_b)
            quotient++;
        return quotient;
    }

它似乎是正确的,除非我以某种方式在modding 10时获得随机大值,即使我的mod函数只是

    uint128_t operator%(uint128_t rhs){
        return *this - (rhs * (*this / rhs));
    }

4 个答案:

答案 0 :(得分:2)

这个怎么样:

int div;  // Uninitialized variable.

如果流上的所有测试都失败,会发生什么 然后div可以有任何价值。如果它是0(或1)则rhs永远不会达到0。

答案 1 :(得分:2)

在表达“copyn&gt;(copyd&lt;&lt; 1)”中,“copyd&lt;&lt; 1”可能溢出,导致您正在观察的无限循环。我建议检查溢出,或检查更像“(copyn&gt;&gt; n)&gt; copyd”。

答案 2 :(得分:0)

如果存在无限循环,您甚至无法输出-1。 -1不小于-123455,但你应该尝试一下。运算符&lt;&lt;&lt;&lt;&lt;&lt;但你对operator /的假设有问题。还有其他错误,但我不确定我是否应该做你的作业^ _ ^

答案 3 :(得分:0)

我不确定这是不是问题,但看起来像是:

stream << out;
return stream;

在类范围之外是函数之外。

您可能希望摆脱}之后的else之一。