16進ポイントを使用して一部の16進数を処理したいのですが、dc
精度の問題が発生します。たとえば、以下では両方とも16進数F423F.FD
を掛けます100
。期待される答えはですF423FFD
。代わりに提供されるものはF423FFA.E1
近いですが、丸め後も十分に正確ではありません。
$ dc
16 d i o F423F.FD 100 * p
F423FFA.E1
dc
私はこれが無限精度計算機であり、決して大きな数字ではないことを読みました。私は何が間違っていましたか?
答えてくれてありがとう。問題を考慮して、dc
私は弾丸を壊し、他の基礎の間違いを解析するために独自のパーサーを作成しました。誰でもコードに興味がある場合は、ここに投稿できます。
ベストアンサー1
10進表記法(dc
変換用)で表現すると999999.98(捨て)×256に該当し、つまり255999994.88(16進 F423FFA.E1)
したがって、違いは次dc
の丸め動作で発生します。 256×(999999 + 253 ¼ 256)(255999997提供)を計算する代わりに、253 ¼ 256を四捨五入して結果を掛けます。
dc
は普段着精密計算機は、ユーザーが望む精度で計算できますが、それが何であるかを知らせる必要があることを意味します。デフォルトでは、精度は0です。つまり、除算は整数値のみを生成し、乗算は入力の桁数を使用することを意味します。精度を設定するにはk
:
10 k
16 d i o
F423FFD 100 / p
F423F.FD0000000
100 * p
F423FFD.000000000
(10進数で1 ¼ 256を表現するのに必要な精度は8桁で十分です。)