この答えは質問のfloat8
側面に基づいています。受け入れられた答えは残りの部分をかなりうまくカバーしています.1つの主な理由の1つに、広く受け入れられていないfloat8
タイプがありますが、標準の欠如以外は実用的ではありません。標準的な記法で浮動小数点
に
プライマーは、float[n]
データ型はメモリ内n
ビットを使用して格納されます。これは、たかだか2^n
の唯一の値しか表現できないことを意味します。 IEEE 754では、nan
のようなこれらの可能な値のほんの一例が偶数ではありません。つまり、すべての浮動小数点表現(あなたがfloat256
になっても)は、有理数の集合にギャップがあり、このギャップの数値を表現しようとすると最も近い値に丸めます。一般に、n
が高いほど、これらの隙間は小さい。
float32
番号のバイナリ表現を取得するためにstruct
パッケージを使用すると、実際にギャップが生じることがあります。その最初の時に実行するために少し驚くべきしかし、32のギャップがちょうど整数空間にあります:
import struct
billion_as_float32 = struct.pack('f', 1000000000 + i)
for i in range(32):
billion_as_float32 == struct.pack('f', 1000000001 + i) // True
一般的に、浮動小数点は、あなたの番号が同じスケールを持っている場合はそのように最上位ビットのみを追跡することで、最高です、重要な違いは保存されています。浮動小数点標準は、一般に、使用可能なビットをベースと指数の間で分配する方法のみが異なります。例えば、IEEE 754 float32
は、ベースに24ビット、指数に8ビットを使用します。
戻るfloat8
に上記ロジックによって、float8
値は今までに関係なく、あなたがベースと指数の間にビットを分割しているどのように巧妙な、256の異なる値を取ることはできません。あなたがそれを熱望していない限り、0に近いクラスタ化された256個の任意の数のうちの1つに数値を丸めると、おそらくint8
の256の可能性を追跡するより効率的です。
たとえば、粗精度で非常に小さな範囲をトラッキングする場合は、必要な範囲を256ポイントに分割してから、最も近い256ポイントのうちのどれを保存するかを選択できます。あなたが本当に気に入らなければならないのであれば、最も重要なことに依存して、中央または端でクラスタ化された値の非線形分布を持つことができます。
他の誰の可能性(偶数または自分後で)この正確なスキームは極めて小さく、代わりにfloat16
またはfloat32
を使用するためのペナルティはに小さすぎるとあなたが支払う余分なバイトまたは3時間のほとんどである必要が意味のある違いを作りなさい。したがって、誰もほとんどfloat8
の実装を記述するのは苦労します。
これは、Numpy float16の計算結果が、float16ハードウェアで計算された場合とまったく同じではないことを意味しますか? これは間違いありませんか? – JonyK
@ JonyK:いいえ、全く反対です。 :-) 4つの基本的な算術演算と平方根については、結果は、IEEE 754準拠のハードウェアによってfloat16形式で直接計算された場合と同じ*正確に*同じでなければなりません(少なくとも、丸めモード)。これは完全にはっきりしているわけではありません。各演算に対して短い証明が必要です。float32の精度はfloat16の精度の2倍を超えていますが、それは本当です。 (対照的に、80ビットx87の拡張精度型をfloat64 *と組み合わせると、二重丸めの問題につながる可能性があります。) –
@JonyK:上記の証明のスケッチを追加するために、 。その間に、「何が重複しないか」というGoogleの検索を試してみてください。 –