[インデックス 19434] ファイルの概要
このコミットは、Go言語のテストスイートに含まれる test/float_lit2.go
ファイルに対する変更です。このファイルは、Go言語のコンパイラが浮動小数点リテラルをどのように処理するか、特に float32
および float64
型の最大値や丸めに関する挙動をテストするために使用されるものです。具体的には、IEEE 754 浮動小数点標準における特殊なケース、特に最大値に近い数値の表現と丸め処理について、コメントで詳細な説明が記述されています。このコミットは、そのコメント内のタイプミスを修正することを目的としています。
コミット
commit cab54408da90caac6e1f1d6eaeb4166eeb98d899
Author: Russ Cox <rsc@golang.org>
Date: Wed May 21 17:19:12 2014 -0400
test: fix two typos in float_lit2.go
Noted by gri in CL 100660044 review but I missed them.
TBR=gri
CC=golang-codereviews
https://golang.org/cl/97570049
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/cab54408da90caac6e1f1d6eaeb4166eeb98d899
元コミット内容
test: fix two typos in float_lit2.go
Noted by gri in CL 100660044 review but I missed them.
TBR=gri
CC=golang-codereviews
https://golang.org/cl/97570049
変更の背景
このコミットは、test/float_lit2.go
ファイル内のコメントに存在する2つのタイプミスを修正するために行われました。コミットメッセージによると、これらのタイプミスは、以前のコードレビュー(CL 100660044)で gri
氏によって指摘されていたものの、見落とされていたものです。コードの機能自体には影響を与えませんが、コメントの正確性と可読性を向上させるための修正です。特に、浮動小数点数の挙動という複雑なトピックを扱うコメントであるため、誤解を招く可能性のあるタイプミスは修正されるべきでした。
前提知識の解説
このコミットの変更内容を理解するためには、以下の前提知識が役立ちます。
浮動小数点数 (Floating-Point Numbers)
コンピュータにおける浮動小数点数は、実数を近似的に表現するための形式です。非常に大きな数から非常に小さな数まで、広範囲の値を表現できますが、精度には限界があります。ほとんどのシステムでは、IEEE 754 規格に基づいて浮動小数点数が表現されます。
IEEE 754 浮動小数点標準
IEEE 754 は、浮動小数点演算の標準です。この標準は、数値の表現形式(符号、指数、仮数)、特殊な値(無限大、非数 NaN)、および丸め規則などを定義しています。Go言語の float32
と float64
は、それぞれ IEEE 754 の単精度(binary32)と倍精度(binary64)に準拠しています。
- 符号 (Sign): 数の正負を表します(1ビット)。
- 指数 (Exponent): 数値の大きさを表します。基数(通常は2)の何乗かを指定します。
- 仮数 (Mantissa / Significand): 数値の精度を表します。正規化された形式では、通常1.xxxx... の形式で表現され、先頭の1は暗黙的に扱われます。
float32
と float64
float32
(単精度): 32ビットで表現されます。符号1ビット、指数8ビット、仮数23ビット(暗黙の1ビットを含めると24ビットの精度)で構成されます。表現できる値の範囲は狭く、精度もfloat64
より低いです。float64
(倍精度): 64ビットで表現されます。符号1ビット、指数11ビット、仮数52ビット(暗黙の1ビットを含めると53ビットの精度)で構成されます。float32
よりも広い範囲の値を表現でき、精度も高いです。
丸め規則 (Rounding Rules)
浮動小数点演算では、計算結果が正確に表現できない場合、最も近い表現可能な値に丸められます。IEEE 754 にはいくつかの丸め規則がありますが、最も一般的なのは「最近接偶数への丸め (Round half to even)」です。
- 最近接偶数への丸め (Round half to even):
- 正確な値が2つの表現可能な値の中間にある場合、仮数の最下位ビットが偶数になる方へ丸められます。
- 例: 2.5 は 2 に、3.5 は 4 に丸められます(整数部が偶数になる方へ)。
- この規則は、統計的なバイアスを避けるために使用されます。
float_lit2.go
の文脈
float_lit2.go
ファイルのコメントは、特に float32
の最大値に近い数値の丸め挙動に焦点を当てています。
f₁ = (1+(1-2⁻²³))×2¹²⁷ = (1-2⁻²⁴)×2¹²⁸ = 2¹²⁸ - 2¹⁰⁴
- これは、
float32
で表現できる最大の「正確な」有限数です。仮数がすべて1で、指数が最大値(ただしオーバーフローしない範囲)の場合に相当します。
- これは、
f₂ = (1+1)×2¹²⁷ = 1×2¹²⁸
- これは、
f₁
の次に大きな値として考えられるものですが、指数がfloat32
の範囲を超えてしまうため、float32
では表現できません(オーバーフロー)。
- これは、
f₁
とf₂
の中間点(f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵
- この中間点が
f₁
に丸められるか、それともf₂
が表現できないために「拒否」されるか、という点がコメントで議論されています。f₁
の仮数が奇数であるため、中間点はf₂
の方へ丸められるべきですが、f₂
が表現できないため、この値はfloat32
の範囲外として扱われます。
- この中間点が
技術的詳細
このコミットは、test/float_lit2.go
ファイル内のコメントのタイプミスを修正するものです。具体的な修正箇所は以下の通りです。
-
1つ目の修正:
- 変更前:
// between f₁ and f₂, values closer to f₁ round to f₁and values closer to f₂ are rejected as out of range.
- 変更後:
// between f₁ and f₂, values closer to f₁ round to f₁ and values closer to f₂ are rejected as out of range.
- 詳細:
f₁and
の部分がf₁ and
に修正されました。これは単なるスペルミスであり、意味をより明確にするための修正です。元の記述ではf₁
とand
が結合されており、読みにくくなっていました。
- 変更前:
-
2つ目の修正:
- 変更前:
// The halfway point (f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵.
- 変更後:
// The halfway point is (f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵.
- 詳細:
The halfway point
の後にis
が追加されました。これにより、文法的に正しい文章となり、より自然な英語表現になります。元の記述は動詞が欠けており、やや不自然でした。
- 変更前:
これらの修正は、コードの動作には一切影響を与えません。しかし、浮動小数点数の複雑な挙動を説明するコメントの正確性と可読性を向上させる上で重要です。特に、このような詳細な技術コメントでは、わずかなタイプミスでも読者の理解を妨げる可能性があります。
コアとなるコードの変更箇所
--- a/test/float_lit2.go
+++ b/test/float_lit2.go
@@ -16,9 +16,9 @@ import (
// The largest exact float32 is f₁ = (1+(1-2²³))×2¹²⁷ = (1-2²⁴)×2¹²⁸ = 2¹²⁸ - 2¹⁰⁴.
// The next float32 would be f₂ = (1+1)×2¹²⁷ = 1×2¹²⁸, except that exponent is out of range.
// Float32 conversion rounds to the nearest float32, rounding to even mantissa:
-// between f₁ and f₂, values closer to f₁ round to f₁and values closer to f₂ are rejected as out of range.
+// between f₁ and f₂, values closer to f₁ round to f₁ and values closer to f₂ are rejected as out of range.
// f₁ is an odd mantissa, so the halfway point (f₁+f₂)/2 rounds to f₂ and is rejected.
-// The halfway point (f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵.
+// The halfway point is (f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵.
//
// The same is true of float64, with different constants: s/24/53/ and s/128/1024/.
コアとなるコードの解説
上記のdiffは、test/float_lit2.go
ファイル内のコメント行に対する2つの修正を示しています。
-
- between f₁ and f₂, values closer to f₁ round to f₁and values closer to f₂ are rejected as out of range.
- この行は、元のコメントでタイプミスが含まれていた部分です。
f₁and
の部分にスペースが欠けていました。
- この行は、元のコメントでタイプミスが含まれていた部分です。
-
+ between f₁ and f₂, values closer to f₁ round to f₁ and values closer to f₂ are rejected as out of range.
- 修正後の行です。
f₁ and
と正しくスペースが挿入され、文法的に正しく、より読みやすくなりました。
- 修正後の行です。
-
- The halfway point (f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵.
- この行も元のコメントでタイプミスが含まれていた部分です。
The halfway point
の後に動詞が欠けていました。
- この行も元のコメントでタイプミスが含まれていた部分です。
-
+ The halfway point is (f₁+f₂)/2 = 2¹²⁸ - 2¹⁰⁵.
- 修正後の行です。
is
が追加され、The halfway point is
となり、文法的に正しい文章になりました。
- 修正後の行です。
これらの変更は、Goコンパイラの浮動小数点リテラル処理に関するテストのコメントの正確性と可読性を向上させるための、純粋なドキュメンテーションの修正です。コードの動作には影響を与えませんが、将来の読者がこの複雑なトピックを理解する上で役立ちます。
関連リンク
このコミット自体に関連する直接的なリンクは、コミットメッセージに記載されているGoのコードレビューシステムへのリンクのみです。
- Go Code Review CL 97570049: https://golang.org/cl/97570049
参考にした情報源リンク
- IEEE 754 - Wikipedia: https://ja.wikipedia.org/wiki/IEEE_754
- 浮動小数点数 - Wikipedia: https://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0
- Go言語の浮動小数点数型 (float32, float64) について: (一般的なGo言語のドキュメントやチュートリアルを参照)
- 最近接偶数への丸め - Wikipedia: https://ja.wikipedia.org/wiki/%E6%9C%80%E8%BF%91%E6%8E%A5%E5%81%B6%E6%95%B0%E3%81%B8%E3%81%AE%E4%B8%B8%E3%82%81