Dc

直流失去精度

  • July 19, 2018

我想dc用十六進制點來處理一些以 16 為基數的數字,但我遇到了精度問題。例如,下面我乘以F423F.FD,100都是十六進制。預期的答案是F423FFD,而是給出F423FFA.E1,接近但即使在四捨五入之後也不夠準確。

$ dc
16 d i o F423F.FD 100 * p
F423FFA.E1

我讀到那dc是一個無限精度的計算器,無論如何這都不是一個大數字。有什麼我做錯了嗎?

感謝您的回答。考慮到 的問題dc,我硬著頭皮寫了自己的解析器來解析其他基數的實數。如果有人對程式碼感興趣,我可以在這裡發布。

請注意,僅列印原始數字表明它是四捨五入的:

$ dc <<<'16 d i o F423F.FD p'
F423F.FA

您可以通過添加大量尾隨零來解決它以提高精度:

$ dc <<<'16 d i o F423F.FD000000 100 * p'
F423FFD.0000000

用十進製表示(dc用來轉換),對應999999.98(四捨五入)×256,255999994.88,即十六進制的F423FFA.E1。

因此差異來自dc的捨入行為:它不是計算 256 × (999999 + 253 ÷ 256),而是將 253 ÷ 256 向下舍入並乘以結果。

dc是一個任意精度計算器,這意味著它可以計算到你想要的任何精度,但你必須告訴它那是什麼。預設情況下,它的精度為 0,這意味著除法只產生整數值,而乘法使用輸入中的位數。要設置精度,請使用k(並記住精度始終以十進制數字表示,無論輸入或輸出基數如何):

10 k
16 d i o
F423FFD 100 / p
F423F.FD0000000
100 * p
F423FFD.000000000

(8 位的精度就足夠了,因為這是您需要用十進製表示 1 ÷ 256。)

引用自:https://unix.stackexchange.com/questions/456794