問題タブ [ieee-754]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 実際のCPUはIEEE754を使用していませんか?
NaNをフィルターで除外し、少し調整した後、結果を変更せずにfloatを32ビットintとして比較でき、doubleを次のように比較できるという前提に基づいて、数値/統計ライブラリの並べ替え関数を最適化しています。 64ビットint。
これにより、これらの配列の並べ替えが40%程度高速化されるようです。浮動小数点数のビットレベル表現が、IEEE 754である限り、私の仮定は当てはまります。実際に使用されているCPUはありますか(ただし、この仮定を破る可能性のある他の表現を使用する組み込みデバイス(このライブラリは対象外)では?
- https://en.wikipedia.org/wiki/Single-precision_floating-point_format(binary32
、別名IEEE754float
を使用するシステム) - https://en.wikipedia.org/wiki/Double-precision_floating-point_format(binary64
、別名IEEE754double
を使用するシステム)
floating-point - IEEE-754データの圧縮アルゴリズム
倍精度浮動小数点値でうまく機能する優れた圧縮アルゴリズムに関する推奨事項はありますか?浮動小数点値のバイナリ表現では、一般的な圧縮プログラム(Zip、RAR、7-Zipなど)では圧縮率が非常に低くなることがわかりました。
圧縮する必要のあるデータは、単調に昇順でソートされた8バイト値の1次元配列です。値は、スパンが通常100度未満のケルビン単位の温度を表します。値の数は、数百から最大64Kの範囲です。
明確化
浮動小数点値の表現方法により、バイトレベルで繰り返しが存在しますが、配列内のすべての値は異なります。
これは科学的なデータであるため、ロスレスアルゴリズムが望まれます。ストレージ効率が大幅に向上している場合は、十分な精度(小数点以下5桁まで)の固定小数点表現への変換が許容される場合があります。
アップデート
このテーマに関する興味深い記事を見つけました。このアプローチが私の要件にどの程度適用できるかわかりません。
c++ - NaNのシグナリングの有用性?
私は最近、IEEE754とx87アーキテクチャについてかなり読みました。作業中の数値計算コードでNaNを「欠落値」として使用することを考えていました。シグナリングNaNを使用すると、必要のない場合に浮動小数点例外をキャッチできるようになることを期待していました。 「欠落している値」に進みます。逆に、私は静かなNaNを使用して、「欠落値」が計算を通じて伝播できるようにします。ただし、NaNのシグナリングは、NaNに存在する(非常に限られた)ドキュメントに基づいて機能すると思っていたようには機能しません。
これが私が知っていることの要約です(これはすべてx87とVC ++を使用しています):
- _EM_INVALID(IEEEの「無効な」例外)は、NaNに遭遇したときのx87の動作を制御します
- _EM_INVALIDがマスクされている(例外が無効になっている)場合、例外は生成されず、操作はクワイエットNaNを返すことができます。NaNのシグナリングを伴う操作では、例外はスローされませんが、クワイエットNaNに変換されます。
- _EM_INVALIDがマスクされていない(例外が有効になっている)場合、無効な操作(sqrt(-1)など)により、無効な例外がスローされます。
- x87はシグナリングNaNを生成しません。
- _EM_INVALIDがマスクされていない場合、シグナリングNaNを使用すると(変数を初期化する場合でも)、無効な例外がスローされます。
標準ライブラリは、NaN値にアクセスする方法を提供します。
と
問題は、NaNのシグナリングには何の役にも立たないということです。_EM_INVALIDがマスクされている場合、それはクワイエットNaNとまったく同じように動作します。他のNaNに匹敵するNaNはないため、論理的な違いはありません。
_EM_INVALIDがマスクされていない(例外が有効になっている)場合、変数をシグナリングNaNで初期化することもできません。
double dVal = std::numeric_limits<double>::signaling_NaN();
これは例外をスローするためです(シグナリングNaN値がx87レジスタにロードされ、メモリアドレスに格納されます)。
あなたは私がしたように次のことを考えるかもしれません:
- マスク_EM_INVALID。
- シグナリングNaNを使用して変数を初期化します。
- Unmask_EM_INVALID。
ただし、手順2ではシグナリングNaNがクワイエットNaNに変換されるため、その後使用しても例外はスローされません。だからWTF?!
シグナリングNaNに何か有用性や目的はありますか?元々の目的の1つは、それを使用してメモリを初期化し、単一化された浮動小数点値の使用をキャッチできるようにすることであったことを理解しています。
私がここで何かが足りないかどうか誰かに教えてもらえますか?
編集:
私がやりたかったことをさらに説明するために、ここに例を示します。
データのベクトル(double)に対して数学演算を実行することを検討してください。一部の操作では、ベクトルに「欠落値」を含めることができます(たとえば、一部のセルに値がないが、それらの存在が重要であるスプレッドシート列に対応していると仮定します)。一部の操作では、ベクトルに「欠落値」が含まれることを許可したくありません。セットに「欠落値」が存在する場合は、おそらく別のアクションを実行したいと思います。おそらく、別の操作を実行します(したがって、これは無効な状態ではありません)。
この元のコードは次のようになります。
「欠落値」のチェックは、ループの反復ごとに実行する必要があることに注意してください。私はほとんどの場合理解していますが、sqrt
関数(または他の数学演算)はこのチェックを覆い隠す可能性があり、演算が最小限(おそらく単なる加算)であり、チェックにコストがかかる場合があります。「欠落値」が正当な入力値を無効にし、計算が合法的にその値に到達した場合にバグを引き起こす可能性があるという事実は言うまでもありません(そうではないかもしれませんが)。また、技術的に正確であるためには、ユーザー入力データをその値と照合し、適切な措置を講じる必要があります。私は、このソリューションがエレガントでなく、パフォーマンス的に最適ではないと感じています。これはパフォーマンスが重要なコードであり、並列データ構造やある種のデータ要素オブジェクトの贅沢は絶対にありません。
NaNバージョンは次のようになります。
これで、明示的なチェックが削除され、パフォーマンスが向上するはずです。FPUレジスタに触れずにベクトルを初期化できれば、これですべてうまくいくと思います...
さらに、自尊心のあるsqrt
実装がNaNをチェックし、すぐにNaNを返すことを想像します。
floating-point - この C++ は PDP-11 float を IEEE に変換しますか?
私は、PDP-11 (エミュレートされた!) プログラムからデータを取得し、それを最新の Windows ベースのシステムに入れるプログラムを維持しています。一部のデータ値が「1.#QNAN」および「1.#QNB」として報告されるという問題が発生しています。顧客は最近、PDP-11 プログラムの「悪い」値が、最初のビットを除くすべてのビットが設定された 2 つの 16 ビット ワードで表されることを明らかにしました。エラーが発生するのは、これらを IEEE float に変換しようとしたときだと思います。
PDP-11 値を IEEE に変換するために使用される以下のコードを見つけました。私は浮動小数点表現の複雑さにあまり触れていませんが、これは少し単純に思えます! これは本当に確実に PDP-11 float を IEEE に変換するでしょうか?
--- アリステア。
ieee-754 - IEEE 754 の指数
float の指数が 127 だけ変位するのはなぜですか?
本当の問題は、2 の補数表記と比較して、そのような表記の利点は何ですか?
c++ - 浮動小数点計算の精度/精度について、もしあれば、どのような主張をすることができますか?
多くの浮動小数点計算を行うアプリケーションに取り組んでいます。Intel x86 では、倍精度浮動小数点値を持つ VC++ を使用します。私たちの計算は10 進数n桁まで正確であると主張しています (現在は 7 桁ですが、15 桁を主張しようとしています)。
結果がわずかに変化した場合 (コードのリファクタリング、クリーンアップなどにより)、他のソースに対して結果を検証するために多くの努力を払います。FPU 制御状態、コンパイラ/オプティマイザ、浮動小数点モデル、演算自体 (つまり、アルゴリズム自体) の全体的な順序など、多くの要因が全体的な精度に影響することはわかっていますが、固有の不確実性を考えると、 FP 計算 (たとえば、0.1 を表すことはできません) では、すべての計算について特定の精度を主張することは無効に思えます。
私の質問はこれです: 任意の種類の分析 (間隔分析など) を行わずに、一般的に FP 計算の精度について何らかの主張をすることは有効ですか? もしそうなら、どのような主張が可能で、その理由は何ですか?
編集:
入力データがたとえば小数点以下n桁まで正確であるとすると、倍精度が使用されていることを考えると、任意の計算の結果について何らかの保証を行うことができますか? たとえば、入力データの有効桁数が 8 桁の場合、出力の有効桁数は少なくとも 5 桁になります... ?
私たちは数学ライブラリを使用しており、それらが行う保証または行わない保証については認識していません。私たちが使用するアルゴリズムは、必ずしも正確に分析されているわけではありません。ただし、特定のアルゴリズムが与えられたとしても、実装は結果に影響します (たとえば、2 つの加算演算の順序を変更するだけです)。たとえば、倍精度を使用する場合、固有の保証はありますか?
別の編集:
私たちは、他の情報源に対して結果を経験的に検証します。では、たとえば 10 桁の精度を達成できたとき、私たちは幸運に恵まれているのでしょうか?
haskell - Haskell での float の 16 進表現
Haskell Float を、標準 IEEE 形式の float の 32 ビット 16 進表現を含む String に変換したいと考えています。これを行うパッケージが見つからないようです。誰か知っていますか?
GHC.Float が Float を符号付きの基数と指数に分解する関数 (decodeFloat) を提供していることに気付きましたが、これは基数と指数にそれぞれ 14 桁と 8 桁の 16 進数を提供し、それはさらに多くを占めます。 32ビット以上。これは役に立たないようです。
これを行う簡単な方法があれば、私に知らせてください。
floating-point - tcl_precision のステータスは何ですか?
私は日常業務で Tcl を使用しません。しかし、私たちのツールの拡張言語が Tcl (!) のように機能することを望んでいる顧客と時折やり取りする同僚がいます。彼が持ち出したトピックの 1 つは、Tclがグローバル変数 tcl_precision を介して doubleに格納される精度をどのように設定できるかということでした。
私はいくつかの Web 検索を行いましたが、見つけたドキュメントは確かにこれが事実であることを示唆しているようです (印刷精度を設定するだけではありません)。ただし、tcl_precision には波乱万丈の歴史があるようです。1つか2つのバージョンで完全に削除されてから元に戻されたという印象を受けますが、デフォルト値0をオーバーライドすることについて警告とツットゥッとあります。これは実際には17を意味します(マニュアルでは、IEEE 754 ダブル)。
では、tcl_precisionが実際に行うことを約束していること、および隠れた double にどのような影響があるかについて、誰か教えてもらえますか? 数値を出力するための単なるグローバル設定ですか、それとも実際に格納されている数値の精度を切り捨てますか (これは私には危険に思えます)?
c++ - float と double の違いは何ですか?
倍精度と単精度の違いについて読みました。ただし、ほとんどの場合、float
とdouble
は互換性があるようです。つまり、どちらを使用しても結果には影響しないようです。これは本当にそうですか?float と double はいつ交換できますか? それらの違いは何ですか?
binary - 10 進数を IEEE 754 単精度浮動小数点形式に変換するにはどうすればよいですか?
10 進数 (10 進数) を手動で IEEE 754 単精度浮動小数点形式に変更するにはどうすればよいですか? 符号、指数、仮数の 3 つの部分があることを理解しています。最後の 2 つの部分が実際に何を表しているのか完全には理解できません。