2015-07-19 69 views
1

問題的簡短版本:計算大型int64_t和double時在當前設置中溢出或超時,無論如何避免這些?在C++中計算double類型變量的另一種方法是什麼?


測試用例: 如果只有需求80,000,000,000,用正確的結果解決。但是,如果它是800,000,000,000,則返回的不正確0。 如果輸入有兩個或更多的要求(意味着需要計算更多的不平等),較小的值也會導致不正確。例如,三個相同的要求20,000,000,000將導致該問題。


我使用COIN-OR CLP線性規劃求解器來解決一些網絡流量問題。表示鏈路帶寬時,我使用int64_t。但CLP大部分時間使用double,並且無法輕鬆轉移到其他類型。

當變量的值不是很大(通常小於10,000,000,000)並且約束(不等式)相對較少時,它會給出我想要的解決方案。但是,如果上述任一因素增加,該工具將停止並返回一個0值解決方案。我認爲原因是計算複雜度超過了它的最大值,所以程序在一些不重要的地方中斷了(它使用LP單純形法)。

不平等是某種:

totalFlowSum <= usePercentage * demand 

我改成了

totalFlowSum - usePercentage * demand <= 0 

由於totalFLowSumdemand是非常大的int64_tusePercentagedouble,如果這樣的限制太多(幾個甚至更多),或者如果需求大於100,000,000,000,返回的解決方案將是錯誤的。

是否有任何方法可以解決這個問題,比如增加中斷閾值或者避免這個級別的計算量?

降低一些準確度是可以接受的。我有一個可能的解決方案,就是輸入小1000倍,輸出大1,000倍。但這是一種天真的做法,可能會導致程序中的代碼修改過多。


更新: 我已經改變了配方

totalFlowSum/demand - usePercentage <= 0 

,但問題依然存在。


更新2: 我除以1000 usePercentage,使得它的係數從1至0.001,它的工作。但是如果我同時將totalFlowSum/demand除以1000,仍然沒有結果。我不知道爲什麼...

+0

我懷疑當總流量總和接近由使用百分比修改的需求時,這個問題在某種程度上與「double」值有關。該修訂版沒有幫助,因爲它確實不會更改計算。通常情況下,認爲'double'將保存15位十進制數或更多(1E15左右);我感到驚訝的是,你遇到的問題只有1E11那麼小。用戶比例是什麼樣的價值?它實際上是一個分數,還是你需要沿着線路分割100?需求和總流量是什麼樣的價值? –

+0

您是否考慮過使用:'totalFlowSum <=(int64_t)(userPercentage * demand)'? –

+0

感謝@JonathanLeffler,關於你的第一條評論,如果它們接近,分數應該接近1,現在它只等於0.對於第二條評論,我不能將它轉換爲int64_t,因爲解算器限制作爲其函數參數的類型要加倍。 –

回答

0

我改變了相等的rhs從00.1,問題就解決了!由於輸入非常大,所以0.1偏移量不會影響解決方案。 我認爲原因是之前的係數是嚴重縮放的,所以編譯器未能找到確切的答案。

相關問題