ホームページ  >  記事  >  バックエンド開発  >  非正規数が精度と表現長の間でトレードオフになるのはなぜですか?

非正規数が精度と表現長の間でトレードオフになるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-08 12:34:01151ブラウズ

Why are Subnormal Numbers a Tradeoff Between Precision and Representation Length?

IEEE 754 の基本

IEEE 754 浮動小数点標準は、数値を次の形式に編成します:

  • 1 ビット: 符号
  • 8 ビット:指数
  • 23 ビット: 分数

非正規数

エンジニアは懸念事項に対処するために非正規数を実装しました。 2 進数表現では、0.0 を除くすべての数値の先頭に 1 が付きます。この先頭ビットの精度の無駄を避けるために、「先頭ビット規則」が作成されました。

ただし、これにより、ゼロ以外の最小の数値が以前の標準よりも大きくなります。エンジニアは、例外として非正規数を導入しました。

  • 指数は 0
  • 先頭ビットは 0 に設定されます
  • 指数は -126 に固定されます

これにより、最小の非正規化よりも小さい数値の表現が可能になります。 value.

非正規数のトレードオフ

非正規数は、精度と表現長の間のトレードオフを表します。数値が小さいほど精度は低下しますが、表現される値の数は 2 倍になります。

視覚化

幾何学的に、非正規化は指数 0 の範囲を拡張し、数値に使用できるスペースを 2 倍にします。

の実装Subnormals

C float は、ほとんどのデスクトップ マシンで 32 ビット IEEE 754 数値を表します。 C プログラムの例では、非正規数のプロパティを示します。

#include <assert.h>
#include <inttypes.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct {...} Float32; // Represents the 32-bit floating point

float float_from_bytes(..., uint32_t fraction); // Reconstructs float from individual parts
bool float32_equal(float f, uint32_t sign, uint32_t exponent, uint32_t fraction); // Compares float to individual parts

int main() {
    assert(float32_equal(0.5f, 0, 126, 0));
    assert(isnormal(0.5f));
    ... // More assertions

    return EXIT_SUCCESS;
}

実装における非正規

一部のプラットフォームでは、非正規数の実装効率が低い場合があります。 ARMv8 は、パフォーマンスの最適化のために非正規化がゼロに丸められる「フラッシュ トゥ ゼロ」モードを提供します。

非正規化と非正規化

非正規化と非正規化は同義語です。

その他の特殊な番号ケース

  • 無限: 通常の数値で表すには大きすぎる数値を表します。
  • NaN (非数値): 有効な結果が得られなかった計算を表します。無効な入力が原因です。

以上が非正規数が精度と表現長の間でトレードオフになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。