QA@IT

浮動小数点数の文字列表現に関する規格

2619 PV

浮動小数点数を CSV などのテキストフォーマットに出力する際に、どのような文字列表現にするのが適当でしょうか?

たとえば C の printf("%f", value) では、0.0000001230.000000 になるなど、精度が落ちる問題があります。

できるだけ精度を落とさず、いろいろな環境で扱えるようにしたいので、広く使われている規格などあれば、教えてください。

なお、出力しようとしているのは Ruby の Float で、実体は C の double のようです。

回答

double ということは、普通、2進数で 53桁の精度があります。
そして、2進53桁の値は、10進17桁に変換し、変換した値を逆に 2進53桁に変換すると、元の値に戻ります。
ただし、ここで「変換」は変換元の値にもっとも近い値を選ぶものとします。

なので、printf のフォーマットで言えば、%.17g あたりが妥当なんじゃないでしょうか。

なお、printf の %.17g がちゃんと与えた double の値にもっとも近い 10進数に変換してくれるか、また逆に 10進数から double に変換するときに、もっとも近い double の値に変換してくれるかはツールによります。(これを実装するのは簡単ではないのです。)

最近の ruby はそのようにしてくれたような気がしますが、昔はそうではありませんでした。
他のツールもさまざまでしょう。

編集 履歴 (0)
  • 回答ありがとうございます。10 進で精度を確保できる桁数を算出 + g で指数表示、ということですね。いくつかの言語の、標準的な文字列・浮動小数点数変換で試してみたところ、たしかに微妙な誤差がありましたが、許容できる範囲でした。実用上、これで問題なさそうです。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。