Math 避免不必要的溢出

Math 避免不必要的溢出,math,int,overflow,fractions,Math,Int,Overflow,Fractions,我被一个问题困住了。我正在编写一个分数计算器(用于作业)。到目前为止,它工作得很好,问题是我必须处理算术溢出。我做了一些研究,现在明白了。但是,我不知道如何处理它。溢出是由命名器和分母之间的简单操作引起的 我们给出的例子是,分式运算:999999/1000000*500000/999999应该给出1/2的答案。当我的程序将9999999*500000相乘时,会出现溢出,最终结果不准确(我得到-2 10204169/22761874) 主要目标是在减少的数字可以正确表示而不会溢出时,产生正确的结果

我被一个问题困住了。我正在编写一个分数计算器(用于作业)。到目前为止,它工作得很好,问题是我必须处理算术溢出。我做了一些研究,现在明白了。但是,我不知道如何处理它。溢出是由命名器和分母之间的简单操作引起的

我们给出的例子是,分式运算:999999/1000000*500000/999999应该给出1/2的答案。当我的程序将9999999*500000相乘时,会出现溢出,最终结果不准确(我得到-2 10204169/22761874)

主要目标是在减少的数字可以正确表示而不会溢出时,产生正确的结果


非常感谢您的帮助。

我认为您至少应该告诉我们您使用的是哪种语言。每种语言都有避免这些陷阱的技巧。Python还有一个更好的技巧:

>>> from fractions import Fraction as Fraction
>>> Fraction(999999 * 500000, 1000000 * 999999)
Fraction(1, 2)

谢谢大家的帮助。我终于明白了。我用分子除以分母,然后用floor()四舍五入,将分数转换成小数;当它被四舍五入时,我把它变回了一个分数。看起来很好用

逻辑如下:

operation: 999999/1000000 * 500000/999999

Fraction was 999999/1000000
toDecimal = .999999
floor ()= 1
fraction = 1/1

Fraction was 500000/999999
toDecimal = .5000005
floor ()= .50
fraction = 1/2

operation is now 1/1 * 1/2 = 1/2 (Woohoo!)

希望这能帮助其他人解决这个问题。

我认为您至少应该告诉我们您使用的是哪种语言。每种语言都有避免这些陷阱的技巧。Python有一个更好的技巧:这可能会有点帮助,但我怀疑您的问题是,您正在使用较低的位宽度作为子结果
9999999*500000
不适合32位int,您应该使用64位变量或对操作重新排序,以便子结果适合您的变量。如果你真的在使用分数(我在任何地方都看不到),那么你应该尽可能简化命名和分母,每次修改都用GCD除以它们……谢谢你的回答!我使用C++。这是一个巧妙的伎俩。在C++中复制这个方法吗?