浮動小数点数の出力で厄介な問題に遭遇しました。Windowsで11.545を小数点以下2桁の精度でフォーマットすると、予想どおり「11.55」が出力されます。ただし、Linuxで同じことを行うと、出力は「11.54」です!
私はもともと Python でこの問題に遭遇しましたが、さらに調査したところ、違いは基盤となる C ランタイム ライブラリにあることがわかりました。(アーキテクチャはどちらの場合も x86-x64 です。) C の次の行を実行すると、Python と同様に、Windows と Linux で異なる結果が生成されます。
printf("%.2f", 11.545);
これをより明確にするために、数値を小数点以下 20 桁まで出力しました ( "%.20f"
):
Windows: 11.54500000000000000000
Linux: 11.54499999999999992895
11.545 を 2 進数として正確に格納できないことはわかっています。そのため、Linux は実際に格納されている数値を可能な限り最高の精度で出力するのに対し、Windows はその数値の最も単純な 10 進数表現を出力します。ユーザーが何を意味する可能性が最も高いかを推測しようとします。
私の質問は、Windows で Linux の動作をエミュレートする (合理的な) 方法はありますか?
(Windows の動作は確かに直感的なものですが、私の場合、Windows プログラムの出力と Linux プログラムの出力を実際に比較する必要があり、変更できるのは Windows の出力だけです。ちなみに、私はの Windows ソースを見てくださいprintf
。ただし、float->string 変換を行う実際の関数は で_cfltcvt_l
あり、そのソースは利用できないようです。)
編集:プロットが厚くなります!これが不正確な表現によって引き起こされるという理論は間違っているかもしれません'%.2f' % 0.125
.
Windows: 0.13
Linux: 0.12
ただし、round(0.125, 2)
Windows と Linux の両方で 0.13 を返します。