Rust: 16進浮動小数点リテラルのサポートを追加します

作成日 2012年01月05日  ·  17コメント  ·  ソース: rust-lang/rust

精度を損なうことなく数学定数を適切にサポートするには、printfの%aの出力を解析できる必要があります。
(つまり、0x1.fffffffffffffp + 1023_f64構文)

A-frontend E-easy

最も参考になるコメント

16進フロートは、C数学ライブラリの間で非常に人気があります。 そして、Rustでも使ってみたいです。

16進フロートが拡張機能としてrustに実装されてから、別のクレートに移動され、 rust-deprecatedなり、夜間の錆でコンパイルに失敗していることがわかります。

この機能の将来は何ですか?

全てのコメント17件

私はこの問題で遊んで、残念ながらこれが問題#1306を復活させると結論付けました。 現在のレクサーでは、 .以降の英字は禁止されています。 パターン0x<digits>.が見つかった場合、それらを選択的に許可することを選択できますが、一貫性がないように思われ、矛盾を解消したい場合は無限の先読みが必要になる場合があります。

ドットの後に数字または0xまたは0bを要求することをお勧めします。 これにより、衝突が回避され、(不思議なことに)必要に応じて基数をリテラルの中間に切り替えることができます。 そしてそれはC99があなたに書かせるものよりほんの少し醜いです。

@graydonまたは、ドットの後にゼロのみを要求できます。 (例: 0x1fffffffffffff.0p+972_f64代わりに0x1.fffffffffffffp+1023_f64

私はこれが後方互換性がなく、名誉を与えるとは思わない。

長編コンプリートのマイルストーンとして承認

2013年7月15日からのトリアージのために訪問しました。 ここで実際に構文を決定しましたか? これは、新しい寄稿者にとっては、構文の明確な仕様を渡すことができれば、とても簡単な作業のようです。 しかし、構文がまだ設計段階にある場合、その主張はあまり真実ではありません。

構文はまだ決まっていないと思いますが、サフィックス(16進数のfで始まるものもあります)との衝突を避ける必要があることを指摘する必要があるので、これを行うと、次の場合にのみ機能するはずです。仮数を指定し、完全な指数(10進数)と組み合わせた場合のみ。

これはまだ実装されていません。

1.0ではない

16進フロートは、C数学ライブラリの間で非常に人気があります。 そして、Rustでも使ってみたいです。

16進フロートが拡張機能としてrustに実装されてから、別のクレートに移動され、 rust-deprecatedなり、夜間の錆でコンパイルに失敗していることがわかります。

この機能の将来は何ですか?

これにも興味があります。 私はゲームに再生可能な物理システムを実装しようとしています。これには、コンピューター間で一貫した結果が必要です。 16進浮動小数点リテラルを使用すると、テストと定数でビット精度の浮動小数点値を記述できます。

少なくとも、このスレッドが「rust hex floatliteral」で最初に得られる結果であるため、この機能が非推奨になっている理由を説明していただければ幸いです。

現時点では状況は少し厄介です。 手続き型マクロは現在改良中です(#38356)。そのため、これが行われている間、 hexfloat最新の状態に保つのは少なくとも時間の無駄です。 でもその後の話はどうなるかわかりません。

私の理解が正しければ、C / C ++の16進フロートがあります。これは、10進フロートが正しく丸められることが保証されていないためです[1]。 ただし、Rustでは、#27307以降---これは必ずしも意図的なものではないと思います!---ほとんどすべての小数浮動小数点数(#31407は実質的に無関係なエッジケースを表します)は最も近い値に丸められる必要があるため、rustcを指定できます。小数桁の適切な数(たとえば、30)であり、正しく丸められた数を取得します。 これは今のところ「実用的な」答えになるでしょう。

16進フロートが関連していると私がまだ考えていることの1つは、C / C ++からの変換です。 すべての16進数のfloatを自分で10進数に変換したくないでしょう:)私は最近、これを正確に実行する実験的な手続き型マクロを作成し、16進数のfloatを10進数のfloatに変換しました(rustcが理解できる)が、これまでのところ、現状は実際には保証されていませんでした---私の意見ではそれは純粋な運です。 constexprsからのみ正確なビットパターンでfloatを作成する方法がある場合は、それを適応させます。

[1]たとえば、ISO C99では、10進数の浮動小数点数を±1.5ulps以内の表現可能な数値に変換する必要があるだけです(「結果は、最も近い表現可能な値、または最も近い表現可能な値のすぐ隣の大きいまたは小さい表現可能な値のいずれかです」 )。

@lifthrasiir 、遅かれ早かれ、Cの16進フロートをRustに正しく変換することで、 https://github.com/jameysharp/corrode/issues/73を修正したいので、コメントをよりよく理解したいと思います。 ここで何が関係しているのかを理解するために、浮動小数点の問題について十分に読んでいません。

Rustコンパイラのバグを法として、すべての16進浮動小数点リテラルを10進浮動小数点リテラルに変換して、Rustコンパイラが同じビットパターンに変換できると言っていますか? もしそうなら、Corrodeにその変換をさせていただければ幸いです。 その変換を正しく行うためのアルゴリズムについて私が読むべきリファレンスをお勧めできますか? (手続き型マクロへのポインターは素晴らしいですが、理想的には、引用する紙や本も欲しいです。)

とは言うものの、16進浮動小数点の正確な10進バージョンはかなり多くの桁を必要とする可能性があるため(右?)、少なくとも16進浮動小数点バージョンは、少なくとも数値の精度を十分に気にしている人にとっては、読みやすく、理解しやすいでしょう。 。 16進フロートがこれらの数値の人間が好む形式である場合、Rustがそれらをサポートする必要があると私は主張します。 したがって、IMO、六角形のフロートを使用したことのある人々からのより多くのフィードバックがここで役立ちます。

Rustコンパイラのバグを法として、すべての16進浮動小数点リテラルを10進浮動小数点リテラルに変換して、Rustコンパイラが同じビットパターンに変換できると言っていますか?

私の信念はイエスです。

その変換を正しく行うためのアルゴリズムについて私が読むべきリファレンスをお勧めできますか?

現在のRustコンパイラと標準ライブラリは必要なすべてのアルゴリズムを実装しているため(難しいアルゴリズムです:-)、これを実装する必要はありません。 本当に参照が必要な場合は、以下を参照してください。

  • 2進数から10進数への変換( "flt2dec"、#24612)は、[Dragon4]と[Grisu3]のハイブリッドです。

    • [Dragon4]:Burger、RGおよびDybvig、RK1996。浮動小数点数を迅速かつ正確に印刷します。 SIGPLANではありません。 31、5(1996年5月)、108-116。
    • [Grisu3]:フロリアンロイッチ。 2010.整数を使用して浮動小数点数をすばやく正確に印刷します。 SIGPLANではありません。 45、6(2010年6月)、233-243。
  • 10進数から2進数への変換( "dec2flt"、#27307)は、[Clinger]によって記述されたいくつかのアルゴリズムです。 (私はそれらを自分で実装していないので、それらについての私の知識は限られています。)

    • [クリンガー]:ウィリアムD.クリンガー。 1990.浮動小数点数を正確に読み取る方法。 SIGPLANではありません。 25、6(1990年6月)、92-101。

ちなみに、私の実装は

とは言うものの、16進浮動小数点の正確な10進バージョンはかなり多くの桁を必要とする可能性があることを収集します(右?)、[...] 16進浮動小数点がこれらの数値の人間が好む形式である場合、Rustはそれらをサポートする必要があると主張します。 [...]

正確ではありません。たとえば、 0x1.999999999999bp-4 = 0.10000000000000002です。 Rustが16進フロートをサポートすべきかどうかについては私には意見がありません。

hexfをcrates.ioに正式に公開し@jameysharp 、あなたはおそらくあなたの仕事にhexf-parseを使うことができると思いますか? (アンダースコアのない構文は、C99 hexadecimal-floating-constant非終端記号sansオプションのfloating-suffixほぼ同じで

編集:Aargh私は1つのケースを逃しました。 0x1p1は有効であるはずですが、hexfはそれを認識しません。 おそらく、説明するのは簡単です。

私にとっても同様のユースケース。 floatリテラルの精度を失うことなく、コンパイラからrustコードを生成できるようにしたいと思います。

このページは役に立ちましたか?
0 / 5 - 0 評価