混合分数乘以防止溢出的理想方法?

时间:2011-01-28 23:29:41

标签: language-agnostic math overflow

我有一个包含三个无符号整数字段的简单类:整数值,分子和分母,表示形式的混合数字:

<Whole> <Num>/<Den>  // e.g. 3 1/2

我希望能够将这些类的实例相互增加,但由于我的主应用程序使用相对较大的数字,我担心溢出。是否有一种算法可以实现这种乘法,最大限度地减少乘法溢出的可能性?

如果它不可避免,我可以溢出,我正在寻找的是一种“智能”乘法的方法,以避免在可能的情况下溢出。

3 个答案:

答案 0 :(得分:2)

我不确定您是否确实需要有关乘以混合数字的信息...但此网站解释了如何简单地完成此操作:Multiplying Mixed Numbers

无论如何......您创建的数据结构继承了其各部分的限制。也就是说,即使您只是使用四舍五入的无符号整数,您仍然可能会出现溢出的可能性。如果你担心会破坏你的unsigned int,那么你应该考虑将你正在使用的类型碰到可以处理更多数字的东西。

维基百科对算术溢出有一个非常好的总结和处理它的一些想法:Arithmetic Overflow

答案 1 :(得分:1)

计算两个分母的最小公倍数(LCM)有助于保持数字较小。维基百科上有很多信息,请查看http://en.wikipedia.org/wiki/Least_common_multiple的“最大公约数减少”部分和http://en.wikipedia.org/wiki/Euclidean_algorithm的“实现”部分。

答案 2 :(得分:-1)

有一种方法可以做到这一点,而不是诉诸任意的presision算术。除非你在汇编中编码,否则它更像是一种好奇而不是一种有用的算法,但值得一提。

    int dividend = 0;
    int result = 0;
    int remainder = 0;

    while( num != 0 ) {
        boolean bit = <take the topmost bit of num>
        dividend = remainder << 1;
        if( bit ) {
          dividend += whole;
        }
        int quotient = dividend / div;
        result = (result << 1) + quotient;
        remainder = dividend % div;
        num = num << 1;
    }
    result <<= 1;
    result += ( remainder << 1 ) / div; 

我知道循环是笨拙的,但我的思绪一片空白,我无法改写它,所以一切都整齐地融入其中,但是你应该得到一般的想法,这基本上是你一点一点地执行乘法运算做分工。