2012-01-28 14 views
6

私は例えば、libquadmathを使用して__float128をprintfのしようとしている次の3 constaintsで__float128が情報を失わないために必要なprintf精度は何ですか?

quadmath_snprintf(s, sizeof(s), "%.30Qg", f); 

  1. を出力は、次の生産と一致している必要があります

    number = [ minus ] int [ frac ] [ exp ] 
    
    decimal-point = %x2E  ; . 
    
    digit1-9 = %x31-39   ; 1-9 
    
    e = %x65/%x45   ; e E 
    
    exp = e [ minus/plus ] 1*DIGIT 
    
    frac = decimal-point 1*DIGIT 
    
    int = zero/(digit1-9 *DIGIT) 
    
    minus = %x2D    ; - 
    
    plus = %x2B    ; + 
    
    zero = %x30    ; 0 
    
  2. 上記のプロダクション "s"と一致する文字列にprintfedされた任意の入力__float128 "i"を与え、 "s"を__floaにスキャンフィードしますt128 "j" - "i"は "j"とビット単位で同じでなければなりません。つまり、情報は失われません。少なくともいくつかの値についてはこれはできません(NaN、Infinity)、それらの値の完全なリストは何ですか?

  3. 上記の2つの基準を満たす他の文字列は、候補よりも短いはずです。

上記を満たすquadmath_snprintf形式の文字列(可能な場合は1と3と2)はありますか?もしそうなら、それは何ですか?

上記の生産でポイント2を満たすのに十分正確に表現できない__float128の値は何ですか? (例えば、Nan、+/- Infinityなど)__float128がこれらの値のいずれかを保持しているかどうかを検出するにはどうすればよいですか?

+0

__float128で正確に表現できない無限の小数点セットがあります。 34桁以上の有効桁があるもの書式指定子は、絶対値> = 1E5の場合にランダムな数字を生成します。あなたのアプローチに深刻な欠陥があります。おそらく、問題を解決するために__float128が必要であると考えて開始します。 –

+5

__float128で正確に表現することができない無限の10進数があるという事実は無関係です。ポイント2は、読み返して丸めたときと同じように十進数表現が正確であることを要求します。書式指定子が間違っていることを認識すると、正しい質問が表示されます。私の「アプローチ」はうまくいき、どんな問題を解決しようとしているのか分かりません。 –

答えて

1

x86の場合、GCC __float128タイプはIEEE 754-2008 binary128フォーマットのソフトウェア実装です。 IEEE 754標準では、文字表現に36桁の有意な(10進)桁が含まれている場合、バイナリ→文字 - >バイナリ往復で元の値に戻す必要があります。したがって、フォーマット文字列 "%.36Qg"はそれを行うべきです。

NaNラウンドトリップが元のビット単位の値を復元する必要はありません。

要件3の場合、libquadmathには、この種の「最短表現」のフォーマットのコードは含まれていません。スティールの精神で&白い紙またはデビッド・ゲイによるコード。

0

私の直感は、バイナリフラクション0.1111 ... 1(128個)です。また、1-1/2 ** 128に等しいと、小数点への変換時に最大オーバーフロー数が発生します。その値を10進数に変換してください(今はビッグ・パッケージがありません)、数字の桁数を数え、その上に2〜3を加えれば安全です。私はこれで十分であるという数学的証明はありません。

I/Oの精度が重要な場合は、floatを16進文字列として出力することをお勧めします。正確な浮動小数点IOは難しく、その点でライブラリはバグかもしれません。

+0

"0.1111 ...1(128個)」は「__float128」として表現することはできませんが、あなたが意味していた113に128を固定しても、なぜこの番号が最悪であるのか分かりません。最悪の場合の候補の10進表記は、先頭の9の代わりに先行する1で始まります。 –

関連する問題