簡體   English   中英

浮點運算=從Dec到Binary的最差精度/差異是多少?

[英]Floating-Point Arithmetic = What is the worst precision/difference from Dec to Binary?

因為所有已知的decimal fractions (如0.1),當存儲為floating point (如double或float)時將在內部以“二進制格式”(IEEE 754)表示。 並且一些小數部分不能直接以二進制格式表示。

我還沒有理解的是這種“轉換”的精確度:

1.)浮點本身可以​​具有精度(即“重要”)?

2.)但是從小數部分到二進制部分的轉換也有精度損失?

題:

從十進制分數轉換為浮點分數時,最壞情況精度損失(“所有”可能的小數部分)是多少?

(我想知道這個的原因是,當比較十進制分數與二進制/浮點分數時,我需要考慮精度...以確定兩個數字是否相同。我希望這個精度是緊密/精確的盡可能(decimal fraction == binary fraction +/- precision)

示例(僅假設)

0,1 dec => 0,10000001212121212121212 (binary fraction double) => precision loss 0,00000001212121212121212
0,3 dec => 0,300000282828282 (binary fraction double) => precision loss  0,000000282828282

我不完全清楚你所追求的是什么,但你可能對以下論文感興趣,后面的文章討論了二進制/十進制轉換中涉及的許多准確性問題,包括硬案例列表。

Vern Paxson和William Kahan。 用於測試IEEE十進制二進制轉換的程序。 1991年5月22日http://www.icir.org/vern/papers/testbase-report.pdf

浮點數越大越不准確(正方向和負方向)。 這是因為浮點值是指數格式。

但是,十進制將越來越精確地表示它使用的小數位數越多,無論它有多大。

因此,最差的精度差異將是您正在使用的任何浮點類型的數值限制。

由於我們被教導計算孩子時的方式,很難完全理解二元分數的精確特性。 問題是分數只能是計數系統的功率。 這似乎很明顯,但基本問題是十進制將事物划分為數十,而二進制將事物划分為二十(一半)。

大多數情況下,您有兩次想要計算浮點值:當它是貨幣值時,何時不是。 后者的范圍可以從旋轉軸上的編碼器的輸入到用於處理圖形引擎的虛擬空間中的位置。 小數值在二進制中沒有問題,因為它確實是一個小數值。 這就是為什么FPU幾年前因3D圖形而流行的原因。

問題在於代表貨幣,其中小數部分實際上是離散的十進制單位。 在現實世界中,你可以擁有0.01美元(取決於它是多少美元!),但這很難准確地用二進制表示。 這就是為什么你永遠不應該使用二進制浮點貨幣。

如果你在十進制和二進制浮點之間進行轉換並嘗試進行比較,我會看看為什么要進行轉換以及比較應該達到什么目的。

如果十進制值落在可表示浮點值的范圍內,並且您的語言/實現具有正確舍入的轉換(許多是,有些則沒有),則此類轉換的錯誤受到1/2的限制。連續浮點數之間的距離,或“ulp”(最后位置的單位)。

ulp的相對大小在精確的2的冪和下一個更大的數之間是最大的,因此當輸入剛好小於1 + 1/2 ulp時,實現了decimal和double之間轉換的最大相對誤差,或者價值按2的冪來衡量。 這種值的一個例子是:

1.0000000000000001110223024625156540423631668090820312

(這幾乎無條件地小於1 + 2 ^ -53)。

由於轉換中的誤差具有相對界限,因此絕對誤差會隨着我們將此值向上擴展2的冪而變大。

當然,如果數字超出可表示值的范圍(通過太大或太小),則所有精度都會丟失。 1e400轉換為double收益infinity ; 沒有我們實際輸入的痕跡。 類似地,將1e-400轉換為double會產生零。

數字越大,精度損失就越高(但可能正是您指定的數字)。

你不僅可以將非常小的數字存儲在java中作為float或double,而且非常大的數字也會像9 * 10 ^ 105一樣存儲。

我希望這種精度盡可能緊湊/精確

您可以選擇BigDecimal,您可以在其中指定,您希望獲得多少精確度,但當然您會受到RAM,CPU時間以及JVM限制的限制。

您是否只對絕對精度或相對精度感興趣?

比較精度的差異:

a = 100000000000000,0000000000000001 
b = 100000000000000,0000000000000002

layoutHonkyTonkA= 0,0000000000000001 
layoutHonkyTonkB= 0,0000000000000002

絕對精度差異相同,但相對精度差異非常大。

暫無
暫無

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

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