簡體   English   中英

cpp部門-如何獲得最准確的結果?

[英]cpp division - how to get most accurate outcome?

我想將兩個ull變量除以得到最准確的結果。 最好的方法是什么?

即5000034/5000000 = 1.0000068

如果要“最精確的精度”,則應避免使用浮點運算。

您可能想使用一些大的十進制庫[通常實現定點算法],並且可以定義所需的精度。

您應該避免使用浮點算術,因為它們不是精確的[您有有限的位數來表示每個范圍內的無限數量的數字,因此必須進行某些切片...]。 定點算法(通常在大十進制庫中實現)允許您“動態”分配更多位以表示所需精度的數字。
有關浮點問題的更多信息,請參見這篇[有點高級]文章: 每位計算機科學家都應了解的有關浮點算法的知識

代替(double)(N)/ D,而是做1 +((double)(N-D)/ D)

恐怕“最准確的結果”意義不大。 沒有有限的表示可以精確地表示所有實數; 表示的精確度取決於類型的大小及其內部表示。 在大多數實現中, double精度將給出約17個十進制數字的精度,通常比輸入精度高幾個數量級。 對於單個乘法或除法,通常double精度即可。 (當兩個值之間的差異極大時,會出現加減法的問題。)存在提供更高精度的軟件包( BigDecimalBigFloat等),但它們從來都不是精確的:最終,精度受到您願意讓他們使用的內存量。 它們也比double慢得多,並且通常(略)難於正確使用(因為它們有更多選擇,例如,您想要多少精度)。 您問題的唯一真實答案是另一個問題:您需要多少精度? 以及什么操作順序? 四舍五入的誤差會累積,因此,對於一個除法, double可能就足夠了,但如果天真地將其用於迭代過程,則可能會引起問題。 盡管在這種情況下,解決方案通常不是提高精度,而是以避免問題的方式更改算法。 如果double為您提供所需的精度,請優先使用該擴展類型。 如果沒有,則您沒有選擇的余地,則選擇現有的任意精度庫之一,例如GMP。

(您可能還對四舍五入的處理方式有疑問。例如,出於記賬目的,大多數司法管轄區都有關於如何對整數值進行四舍五入的非常嚴格的法律,其規則基於十進制算術。在這種情況下,您會需要使用數字類型進行十進制算術運算,以便在所有情況下都可以四舍五入。)

浮點數對於乘法和除法可能是最准確的,而整數和定點數是加法和減法的最佳選擇。 這是由於這樣的事實,即乘法和除法會更改浮點數更好地處理的數量級,而加法和減法是某種步驟,整數和定點數會更好地處理。

如果要在除整數時獲得最佳精度,請實現一個包含分子和分母的RationalNumber類。 這樣,如果避免算術溢出,您的結果將始終是精確的。 這要求您接受小數形式的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM