bin_float 適合性

この文書は 0.8.0 における 2 進浮動小数点の意味論と検証境界を記録します。有限のテストが全通過しても、すべての実数入力に対する形式的証明を意味しません。

標準・論文・参照実装

  • IEEE 754-2019:interchange format、丸め方向、符号付きゼロ、NaN、例外、丸め前/後 tininess の意味論。
  • Fousse、Hanrot、Lefèvre、Pélissier、Zimmermann、 MPFR: A Multiple-Precision Binary Floating-Point Library with Correct Rounding、 ACM TOMS 33(2), 2007:厳密結果を一度だけ丸める任意精度モデル。
  • John Hauser による Berkeley の SoftFloat と TestFloat(リリース 3e)が、独立に生成された IEEE の結果・フラグのベクトルを提供します。

数学的意味論とアルゴリズム

有限かつ非ゼロの BinFloat は次の 2 進有理実数を表します。

(-1)^negative * coefficient * 2^exponent2(coefficient は非負の BinCoeff)

有限の係数は 2 の因子を取り除くことで正規化されますが、ゼロの符号は観測可能なまま保たれます。無限大、qNaN、sNaN、NaN のペイロード、NaN の符号は、番兵としての有限値ではなく明示的な状態です。

add_ctx、sub_ctx、mul_ctx、div_ctx、sqrt_ctx、pow_int_ctx は、IEEE 特殊値を先に解決し、dyadic/有理数または平方根の境界で厳密な数学結果を求め、目標精度・方向で一回だけ丸め、最後に指数範囲/subnormal の量子化と五つの IEEE フラグを導出します。テスト ID やテスト値に基づく分岐はありません。

  1. IEEE の特殊ケースは有限の算術より前に解決されます。
  2. 有限の加算、減算、乗算は厳密な 2 進有理数の結果を用います。除算は厳密な整数の商と剰余による判定を用います。平方根は厳密な整数平方根と、丸めの中点との厳密な比較を用います。整数冪は方向付きの包含区間を認証し(Ziv ループ)、認証に成功しない場合は厳密な冪にフォールバックします。
  3. 厳密な結果は要求された精度と丸め方向へ一度だけ丸められ、その後に指数範囲・非正規化数の量子化が適用されます。
  4. 返される BinaryFlags は、その数学的な結果から導かれます。inexact、underflow、overflow、division-by-zero、invalid-operation です。

binary16 の 0x0400 * 0x3BFF は 0x0400 になりますが、 inexact | underflow です。after-rounding tininess は最終 normal encoding ではなく、目標精度で丸めた無界指数の結果から判定します。

いかなる演算も、テストの識別子、テストの値、コーパスの形式によって分岐しません。コーパスのインタプリタは、公開されたコンテキスト付き演算を包むアダプタです。

固定コーパスと結果

BinaryInterchange は IEEE の binary16、binary32、binary64、binary128 のビットパターンをデコード・エンコードします。BinaryContext は精度、丸め方向、対になった指数の上下限、および丸め前・丸め後の極小性(tininess)検出を保持します。エンコードとコンテキスト付き算術はどちらもステータスフラグを返します。通常の演算子は無制限の最近接偶数丸めコンテキストを用い、意図的にそれらのフラグを公開しません。

TestFloat アダプタにおける NaN の比較は、期待される結果が NaN である場合に限りクラス単位で行われます。これは有限値の比較を緩めたものではありません。NaN でないエンコードのビットと、すべての例外ビットは厳密に一致しなければなりません。これは、新たに生成される NaN のペイロードの選択を IEEE が許容していることを反映しています。実装自体は、選ばれた入力 NaN の符号とペイロードを保持し、signaling NaN を quiet NaN にします。

宣言されたコーパスと結果

完全ゲートは testdata/bin_float/README.md に定義します。

ソース範囲結果
TestFloat 3e level 1、seed 14 format × 5 arithmetic operation × 5 rounding × 2 tininess7,461,360 / 7,461,360
TestFloat 3e level 1、seed 14 format × mulAdd(5 rounding × 2 tininess)、rem、roundToInt と四つの integer conversion(5 rounding × exact/非 exact)、六つの comparison predicate246,766,512 / 246,766,512
MPFR 4.2.2 tests/data/sqrt実行可能な 16 進 sqrt 行すべて1,055 / 1,055
MPFR 4.2.2 pow_si フィクスチャ4 precision × 5 supported rounding × 6 input120 / 120
MPFR 4.2.2 初等関数フィクスチャ29 operation × 3 precision × 6 rounding × 4 fixed-seed input2,088 / 2,088
optional MPFR elementary stress、seed 20260715three-operation 以上の各 family で 100,000 case 以上966,744 / 966,744
コミット済み smokeTestFloat、sqrt、pow_si、elementary witness2,451 / 2,451
TestFloat 3e レベル 2binary16 の全 declared operation/direction/tininess50,205,600 / 50,205,600

binary16 の level-2 の結果は追加のストリーミング負荷試験の証拠であり、はるかに大きい binary32/64/128 の level-2 スイートについて主張するものではありません。アーカイブ、ファイルとそのダイジェストは testdata/bin_float/corpora.json に固定されています。ランナーは TestFloat level 2 を検証済みの有界チャンク単位でストリーミング実行しますが、level 2 は任意の負荷試験スイートであり、上記の結果の主張には含まれません。966,744 行の MPFR 実行も同様に任意の生成負荷試験の証拠であり、再現可能なリリース境界は引き続きハッシュで固定された 2,088 行のフィクスチャです。

主張の境界

Evidence の安定性

固定 matrix が release evidence の境界です。新しい operation には新しい corpus contract と oracle が必要です。

four interchange format の contextual add/sub/mul/div/sqrt、fused multiply-add、remainder、roundToIntegral(通常と exact)、符号付き/符号なし 32/64 bit 整数への convertToInteger(通常と exact)、quiet/signaling の equal/less/less-or-equal predicate に加え、24、53、113 bit と六つの project rounding mode における 29 elementary operation を検証します。invalid な整数変換は flag のみ比較します(SoftFloat は platform 依存の sentinel を返し、API は None を返すため)。format 間変換、min/max、total order、nextUp/nextDown、scaleB/logB、decimal character 変換(package test で検証)の TestFloat 適合性、および全 IEEE 754 operation または全実数入力の適合性は主張しません。nearest-away は MPFR が要求する mpfr_round_nearest_away_begin/end protocol で生成し、禁止されている MPFR_RNDNA を general elementary function に直接渡しません。

日常の確認は just conformance smoke binary、固定 full gate は just gate binary を実行します。