2014-09-05 118 views
-1

我困住了一個問題。我正在編程一個分數計算器(對於作業)。到目前爲止它效果很好,問題是我必須處理算術溢出。我做了一些研究,現在瞭解溢出。但是,我不知道如何處理它。溢出是由分子和分母之間的簡單操作引起的。避免不必要的溢出

我們給出的例子是分數操作:999999/1000000 * 500000/999999應該給答案1/2。當我的程序乘以999999 * 500000時出現溢出並且最終結果不準確(我得到-2 10204169/22761874)。

主要目標是在減少的數字可以正確表示而沒有溢出時產生正確的結果。

任何幫助,非常感謝。

+0

我認爲你應該 - 至少 - 告訴我們你正在使用哪種語言。每種語言都有其技巧來避免這些缺陷。 Python有一個更好的技巧: – jcoppens 2014-09-05 23:15:17

+0

想象一下你用鉛筆和紙做這個。我會寫下兩個分數(它們之間的乘法符號),並開始消除分子和分母中的常見因素。一旦我消除了這些因素,我會做一點乘法。這在計算上可能不是最好的(在任何特定意義上),但我不明白爲什麼你不能將它編碼爲第一次嘗試。 – 2014-09-06 11:57:25

+0

可能是這個[如何處理溢出和下溢?](https://stackoverflow.com/a/33006665/2521214)將有所幫助,但我懷疑你的問題是,你正在使用低位寬度的sub-結果...'999999 * 500000'不適合32位int,您應該使用64位變量或重新排序操作,以便子結果適合您的變量。如果你真的使用分數(我沒有看到任何地方),那麼你應該簡化提名和分母,當你可以在每次改變時用GCD分割它們... – Spektre 2017-07-05 10:49:51

回答

0

我認爲你應該 - 至少 - 告訴我們你正在使用哪種語言。每種語言都有其技巧來避免這些缺陷。 Python有一個更好的技巧:

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

感謝您的回答!我正在使用C++。這是一個巧妙的把戲。任何方式來複制C++中的? – BugsGalore 2014-09-05 23:58:17

+0

您是否檢查http://martin-thoma.com/fractions-in-cpp/? – jcoppens 2014-09-06 14:12:52

0

謝謝大家的幫助。我終於弄明白了。我將分數轉換爲小數,方法是將分子除以分母,然後使用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!) 

希望這有助於有人出來這個問題。