私は、とりわけ、測定された数値をテキストと内部 ( double
) 表現の間で変換するソフトウェアに取り組んでいます。プロセスの必要な部分は、測定の統計的不確実性に基づいて正しい小数精度でテキスト表現を生成することです。必要な精度は数値によって異なり、その最下位桁は (10 進数) 単位の桁の左側を含め、どこでもかまいません。
このプロセスには正しい丸めが不可欠です。「正しい」とは、その時点で有効な浮動小数点丸めモード、または少なくとも明確に定義された丸めモードによることを意味します。そのため、丸めは数値の内部表現の最下位ビットにも影響を与える可能性があるため、処理される数値に対して中間演算を実行することに注意する必要があります (読み取り: 回避)。
必要な表現の有効桁数を最初に計算すれば、必要なフォーマットのほとんどすべてを printf ファミリーの関数で適切に実行できると思います。
sprintf(buffer, "%.*e", num_sig_figs - 1, number);
ただし、これまでのところ私を打ち負かしたコーナーケースのクラスが1つあります。測定された数値の最上位(10進数)桁が、目的の精度表現の最下位桁の1桁右にあるケースです。その場合、丸めにより、目的の結果の最下位 (かつ唯一) の桁が 0 または 1 になるはずですが、丸めを移植可能な (*) 方法で実行する方法を考案できませんでした。結果を変える。mpfr_prec_round()
これは、10 進精度を使用する必要があるのに対し、2 進精度で機能することを除いて、MPFR 関数で実行できることと似ています。
たとえば、デフォルトの丸めモード (同順位を偶数に丸める最も近いものに丸める) では、次のようになります。
- 単位 (10^0) で表される 0.5 の精度は「0」または「0e+00」である必要があります
- 千 (10^3) で表現された 654 の精度は "1e+03" でなければなりません
- 10 分の 1 (10^-1) で表現された 0.03125 の精度は、"0" または "0e-01" または "0e+00" である必要があります
(*) ここでの「移植可能」とは、コードが標準の移植可能な C99 (またはそれ以上の C90) で計算を正確に表現することを意味します。実際の結果は、マシンの詳細に依存する可能性があり、有効な浮動小数点丸めモードに依存する (および一致する)必要があることが理解されています。
どのようなオプションがありますか?