7

IEEE 754-1985 double (64 ビット) 浮動小数点数を、人間が判読できるテキスト形式で表現する必要があります。ただし、テキスト形式を解析してまったく同じ (ビット単位の) 数値に戻すことができるという条件があります。

生のバイトを印刷するだけでなく、これを行うことは可能/実用的ですか? はいの場合、これを行うコードは大歓迎です。

4

4 に答える 4

12

最適なオプション: C99 16 進浮動小数点形式を使用します。

printf("%a", someDouble);

doubleこの方法で生成された文字列は、C99strtod( )関数および関数を使用して元に変換できますscanf( )。他のいくつかの言語もこの形式をサポートしています。いくつかの例:

decimal number    %a format     meaning
--------------------------------------------
2.0               0x1.0p1       1.0 * 2^1
0.75              0x1.8p-1      1.5 * 2^-1

16 進形式には、すべての表現が正確であるという利点があります。したがって、文字列を浮動小数点数に変換すると、変換が実行される丸めモードが変更された場合でも、常に元の数値が得られます。これは、不正確な形式には当てはまりません。

なんらかの理由で 16 進形式を使用したくない場合、および丸めモードが常に最も近い値に丸められる (デフォルト) と想定する場合は、データを少なくとも 17 の 10 進数としてフォーマットすることで回避できます。有効数字。正しく丸められた変換ルーチンがある場合 (すべてではありませんが、ほとんどのプラットフォームがそうです)、精度を損なうことなく double から string へのラウンドトリップを実行できることが保証されます。

于 2010-03-19T21:57:29.837 に答える
6

Burger のアルゴリズム(PDF)が必要なようです。

自由形式モードでは、アルゴリズムは、丸め時にリーダーがタイをどのように分割するかに関係なく、読み戻したときに同じ数値に変換される、正しく丸められた最短の出力文字列を生成します。

サンプル ソース コード(C およびスキーム) も利用できます。

これは Python 3.x で使用されているアルゴリズムfloatで、精度を損なうことなく s を文字列に変換したり元に戻すことができます。Python 2.x では、float次の理由により、s は常に 17 桁の有効数字で表されていました。

repr(float)有効数字は 17 桁になります。(ほとんどのマシンでは) これで十分でeval(repr(x)) == xあり、すべての有限 float に対して正確ですxが、16 桁に丸めるだけではそれを実現するには十分ではありません。(ソース: http://docs.python.org/tutorial/floatingpoint.html )

于 2010-03-19T22:24:30.780 に答える
3

.NET フレームワークには、このための往復形式があります。

string formatted = myDouble.ToString("r");

ドキュメントから:

ラウンドトリップ指定子​​は、文字列に変換された数値が解析されて同じ数値に戻されることを保証します。この指定子を使用して数値をフォーマットする場合、最初に、Double の場合は 15 スペースの精度、Single の場合は 7 スペースの精度で、一般的なフォーマットを使用してテストされます。値が正常に解析されて同じ数値に戻された場合は、一般的な書式指定子を使用して書式設定されます。ただし、値が正常に解析されて同じ数値に戻されない場合、値は Double の場合は 17 桁の精度、Single の場合は 9 桁の精度を使用してフォーマットされます。

もちろん、この方法はほとんどの言語で再現できます。

于 2010-03-19T22:15:29.643 に答える
1

はい、可能ですが、実装は言語によって異なります。基本的な考え方は、十分な精度で印刷することです。

ただし、その逆は当てはまらないことに注意してください。10 進数で正確に表現できる一部の数値は、2 進数では表現できません。

于 2010-03-19T22:01:32.443 に答える