Dc
直流失去精度
我想
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。)