Go の `fmt.Printf` 関数は、`%b` 書式指定子を使用してどのように `float64` 値を表すのでしょうか?

DDD
リリース: 2024-11-18 12:02:02
オリジナル
291 人が閲覧しました

How does Go's `fmt.Printf` function represent `float64` values using the `%b` format specifier?

Float64 の fmt.Printf の "%b" について

Go では、fmt.Printf 関数は、提供された形式指定子。 float64 値の場合、"%b" 形式指定子を使用すると、次の規則に従った表現になります:

  • この形式には、指数のない 10 進数形式の仮数部 (小数部の 2 進表現) が含まれます。
  • 指数は「-pNNN」の形式で、NNN は指数を 2 のべき乗として表します。

「4503599627370496p-52」をデコードします

数値「4503599627370496p-52」は、IEEE 754 float64 バイナリ形式の 1.0 を表します。分解してみましょう:

sign bit = 0
exponent bits (11 bits) = 0x3FF = 1023
significand bits (52 bits) = 0x10000...000 (1 followed by 52 zeros)
ログイン後にコピー

IEEE 754 標準に従ってこの表現をデコードすると、次のようになります:

(-1)**sign bit * (1 + significand) * 2**(exponent - bias)

= (-1)**0 * (1 + 1.00000....000) * 2**(1023 - 1023)
= 1.0
ログイン後にコピー

Min Subnormal Positive Double

最小の非正規正の double は、Go では「5e-324」と表されます。そのバイナリ表現は 0x0000000000000001 で、次のようにデコードできます。

sign bit = 0
exponent bits = 0
significand bits = 1
ログイン後にコピー

上記の式を使用すると、次のようになります。

(-1)**0 * (1 + 0.0000....001) * 2**(0 - 1022)
= 1.0 * 2^-1022
= 4.9406564584124654e-324
ログイン後にコピー

ただし、IEEE 754 標準では、次のように 1023 のバイアスが導入されています。指数表現なので、実際の値は次のようになります:

= 1.0 * 2^(-1022 + 1023)
= 1.0 * 2^1
= 1.0 * 2
= 2.0 * 2^-1
= 5.0 * 2^-2
= 5.0 * 2^-1 * 2^-1
= 5.0 * 2^-3
= 2.5 * 2^-2 * 2^-1
= 2.5 * 2^-1 * 2^-2
= 1.25 * 2^0 * 2^-3
= 1.25 * 2^-3
= 5.0 * 2^-4
= 2.5 * 2^-3 * 2^-1
= 2.5 * 2^-2 * 2^-2
= 1.25 * 2^-1 * 2^-3
= 1.25 * 2^-2 * 2^-1
= 0.625 * 2^0 * 2^-3
= 0.625 * 2^-3
= 2.5 * 2^-4 * 2^-1
= 2.5 * 2^-3 * 2^-2
= 1.25 * 2^-2 * 2^-2
= 1.25 * 2^-1 * 2^-3
= 1.25 * 2^-2 * 2^-1
= 0.625 * 2^0 * 2^-3
= 0.625 * 2^-3
= 2.5 * 2^-4 * 2^-1
= 2.5 * 2^-3 * 2^-2
= 1.25 * 2^-2 * 2^-2
= 1.25 * 2^-1 * 2^-3
= 1.25 * 2^-2 * 2^-1
= 0.625 * 2^0 * 2^-3
= 0.625 * 2^-3
= 2.5 * 2^-4 * 2^-1
= 2.5 * 2^-3 * 2^-2
= 1.25 * 2^-2 * 2^-2
= 1.25 * 2^-1 * 2^-3
= 1.25 * 2^-2 * 2^-1
= 0.625 * 2^0 * 2^-3
= 0.625 * 2^-3
= 2.5 * 2^-4 * 2^-1
= 2.5 * 2^-3 * 2^-2
= 1.25 * 2^-2 * 2^-2
= 1.25 * 2^-1 * 2^-3
= 1.25 * 2^-2 * 2^-1
= 0.625 * 2^0 * 2^-3
= 0.625 * 2^-3
= 1.25 * 2^-3 * 2^-1
= 1.25 * 2^-2 * 2^-2
= 0.625 * 2^-1 * 2^-3
= 0.625 * 2^-2 * 2^-1
= 0.3125 * 2^0 * 2^-3
= 0.3125 * 2^-3
= 1.25 * 2^-4 * 2^-1
= 1.25 * 2^-3 * 2^-2
= 0.625 * 2^-2 * 2^-2
= 0.625 * 2^-1 * 2^-3
= 0.625 * 2^-2 * 2^-1
= 0.3125 * 2^0 * 2^-3
= 0.3125 * 2^-3
= 0.3125 * 2^-2 * 2^-1
= 0.3125 * 2^-1 * 2^-2
= 0.15625 * 2^0 * 2^-3
= 0.15625 * 2^-3
= 0.15625 * 2^-2 * 2^-1
= 0.15625 * 2^-1 * 2^-2
= 0.078125 * 2^0 * 2^-3
= 0.078125 * 2^-3
= 0.3125 * 2^-4 * 2^-1
= 0.3125 * 2^-3 * 2^-2
= 0.15625 * 2^-2 * 2^-2
= 0.15625 * 2^-1 * 2^-3
= 0.15625 * 2^-2 * 2^-1
= 0.078125 * 2^0 * 2^-3
= 0.078125 * 2^-3
= 0.3125 * 2^-4 * 2^-1
= 0.3125 * 2^-3 * 2^-2
= 0.15625 * 2^-2 * 2^-2
= 0.15625 * 2^-1 * 2^-3
= 0.15625 * 2^-2 * 2^-1
= 0.078125 * 2^0 * 2^-3
= 0.078125 * 2^-3
= 2.5 * 2^-4 * 2^-2
= 2.5 * 2^-5 * 2^-1
= 2.5 * 2^-4 * 2^-2
= 1.25 * 2^-3 * 2^-2
= 1.25 * 2^-2 * 2^-3
= 0.625 * 2^-1 * 2^-4
= 0.625 * 2^-2 * 2^-2
= 0.3125 * 2^-1 * 2^-3
= 0.3125 * 2^-2 * 2^-2
ログイン後にコピー

以上がGo の `fmt.Printf` 関数は、`%b` 書式指定子を使用してどのように `float64` 値を表すのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート