この質問のフォローアップでは、一部の数値は浮動小数点でまったく表現できず、代わりに概算されているようです。
浮動小数点数はどのように格納されますか?
異なるサイズに共通の規格はありますか?
浮動小数点を使用する場合、どのような問題に注意する必要がありますか?
それらは言語間で互換性がありますか (つまり、浮動小数点数を Python プログラムから TCP/IP 経由で C プログラムに送信するには、どのような変換を行う必要がありますか)?
この質問のフォローアップでは、一部の数値は浮動小数点でまったく表現できず、代わりに概算されているようです。
浮動小数点数はどのように格納されますか?
異なるサイズに共通の規格はありますか?
浮動小数点を使用する場合、どのような問題に注意する必要がありますか?
それらは言語間で互換性がありますか (つまり、浮動小数点数を Python プログラムから TCP/IP 経由で C プログラムに送信するには、どのような変換を行う必要がありますか)?
前述のように、IEEE 754 に関するウィキペディアの記事は、ほとんどのシステムで浮動小数点数がどのように格納されるかをよく示しています。
さて、ここにいくつかの一般的な落とし穴があります:
規格はIEEE 754です。
もちろん、IEE754 が十分でない場合に数値を保存する方法は他にもあります。Java のようなライブラリBigDecimal
は、ほとんどのプラットフォームで利用でき、SQL の数値型にうまく対応します。記号は無理数に使用でき、2 進または 10 進浮動小数点で正確に表現できない比率は比率として格納できます。
質問の 2 番目の部分については、パフォーマンスと効率がプロジェクトにとって重要でない限り、TCP/IP 経由で浮動小数点データを文字列として転送することをお勧めします。これにより、バイト アラインメントなどの問題を回避でき、デバッグが容易になります。
基本的に、浮動小数点数で心配する必要があるのは、精度の桁数が限られていることです。これは、等しいかどうかをテストするとき、またはプログラムが実際にそのデータ型が与える精度よりも多くの桁数を必要とする場合に問題を引き起こす可能性があります。
C++ では、float の精度は 7 桁、double の精度は 15 桁であると考えてください。また、等しいかどうかをテストする方法を知りたい場合は、この質問スレッドを参照してください。
この質問へのフォローアップでは、一部の数値は浮動小数点でまったく表現できず、代わりに概算されているようです。
正しい。
浮動小数点数はどのように格納されますか? 異なるサイズに共通の規格はありますか?
他の投稿者が既に述べたように、ほぼ独占的に IEEE754 とその後継の IEEE754R です。グーグルで検索すると、ビットパターンとその説明とともに何千もの説明が得られます。それでも取得に問題がある場合は、IBM と DEC-VAX という 2 つの一般的な FP 形式がまだあります。一部の難解なマシンとコンパイラ (BlitzBasic、TurboPascal) には、いくつかの奇妙な形式があります。
浮動小数点を使用する場合、どのような問題に注意する必要がありますか? それらは言語間で互換性がありますか (つまり、浮動小数点数を Python プログラムから TCP/IP 経由で C プログラムに送信するには、どのような変換を行う必要がありますか)?
ほとんどありませんが、言語間で互換性があります。
非常にまれに発生する癖:
IEEE754 では、sNaN (シグナリング NaN) と qNaN (静止 NaN) が定義されています。前者はトラップを引き起こし、プロセッサがロードされた場合にハンドラー ルーチンを強制的に呼び出します。後者はこれを行いません。言語設計者は、sNaN がワークフローを中断し、それらをサポートすることでハンドラー ルーチンのサポートが強制される可能性を嫌っていたため、ほとんどの場合、sNaN は暗黙のうちに qNaN に変換されます。したがって、1:1 の raw 変換に依存しないでください。ただし、これは非常にまれであり、NaN が存在する場合にのみ発生します。
異なるコンピューター間でファイルが共有されている場合、エンディアンの問題 (バイトの順序が間違っている) が発生する可能性があります。数値の NaN を取得しているため、簡単に検出できます。
「IEEE Standard 754 Floating Point Numbers」というタイトルのこの記事が役立つ場合があります。正直なところ、私はあなたの質問を完全に理解しているかどうかわからないので、これが役立つかどうかはわかりませんが、そうであることを願っています.
はい、2 進浮動小数点演算の IEEE 標準 (IEEE 754)があります。
数値は、2 進数で格納される場合、符号、指数、および小数の 3 つの部分に分割されます。
浮動小数点の丸め誤差が本当に心配な場合は、ほとんどの言語で浮動小数点誤差のないデータ型が提供されています。SQL Server には Decimal と Money のデータ型があります。.Net には Decimal データ型があります。これらは、Java の BigDecimal のように無限の精度ではありませんが、定義されている小数点以下の桁数まで正確です。したがって、$4.58 として入力したドルの値が 4.579999999999997 の浮動小数点値として保存されることを心配する必要はありません。
私が覚えているのは、32 ビットの浮動小数点が実際の数値に 24 ビットを使用して格納され、残りの 8 ビットが 10 のべき乗として使用され、小数点の位置が決定されることです。
私はこの件に関して少し錆びています...