[インデックス 19516] ファイルの概要
このコミットは、Go言語のmath
パッケージにおける浮動小数点数操作関数Nextafter
およびNextafter64
に関する変更です。具体的には、float64
型に対する「次の表現可能な浮動小数点数」を計算する関数Nextafter64
が、既存のNextafter
関数に統合され、Nextafter64
という名前のエイリアスが削除されました。これにより、コードの重複が解消され、APIが簡素化されています。変更は主にsrc/pkg/math/nextafter.go
、src/pkg/math/all_test.go
、およびsrc/pkg/math/big/rat_test.go
に及びます。
コミット
- コミットハッシュ:
3d68dc332517d7f6ef38d42e9a3211655958b20b
- 作者: Robert Griesemer gri@golang.org
- コミット日時: Wed Jun 11 14:24:16 2014 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3d68dc332517d7f6ef38d42e9a3211655958b20b
元コミット内容
math: remove Nextafter64 alias in favor of existing Nextafter
LGTM=adonovan
R=rsc, adonovan
CC=golang-codereviews
https://golang.org/cl/104050045
変更の背景
この変更の背景には、Go言語の標準ライブラリにおけるAPIの整合性と簡潔性の追求があります。元々、math
パッケージにはfloat32
用のNextafter32
とfloat64
用のNextafter64
が存在していました。しかし、Nextafter
という関数名も存在し、これはNextafter64
のエイリアスとして機能していました。
このような状況は、以下の点で問題がありました。
- 冗長性:
Nextafter
とNextafter64
が同じ機能を提供しており、冗長でした。 - 混乱の可能性: ユーザーがどちらの関数を使うべきか迷う可能性がありました。特に、
Nextafter
という名前がfloat64
専用であるということが直感的に分かりにくい場合がありました。 - APIの統一性:
math
パッケージ内の他の関数(例:Abs
,Sqrt
など)は、引数がfloat64
の場合に型サフィックスなしで提供されるのが一般的です。Nextafter64
という名前は、この命名規則から逸脱していました。
このコミットは、Nextafter64
を削除し、その機能を既存のNextafter
関数に統合することで、これらの問題を解決し、APIをよりクリーンで一貫性のあるものにすることを目的としています。これにより、float64
の「次の表現可能な浮動小数点数」を取得する際には、シンプルにmath.Nextafter
を使用するようになります。
前提知識の解説
浮動小数点数 (IEEE 754)
コンピュータにおける浮動小数点数は、実数を近似的に表現するための形式です。Go言語では、float32
(単精度、32ビット)とfloat64
(倍精度、64ビット)の2種類の浮動小数点数型がIEEE 754標準に準拠して実装されています。
IEEE 754標準では、浮動小数点数は符号部、指数部、仮数部で構成されます。この表現形式により、非常に広い範囲の数値を表現できますが、その精度には限界があります。特に、連続する実数値を正確に表現できるわけではなく、特定の離散的な値のみを表現できます。
次の表現可能な浮動小数点数 (Next Representable Floating-Point Value)
浮動小数点数の特性として、ある数値の次に大きい(または小さい)表現可能な数値は、その数値に非常に近いですが、完全に連続しているわけではありません。この「次に表現可能な浮動小数点数」を見つけることは、数値計算の精度分析、誤差伝播の理解、または特定のアルゴリズム(例: 区間演算)の実装において重要です。
例えば、1.0
の次に大きいfloat64
値は1.0000000000000002
であり、その差は非常に小さいですが、有限の精度を持つ浮動小数点数演算ではこの「ギャップ」が重要になります。
math.Nextafter
関数
Go言語のmath
パッケージには、この「次の表現可能な浮動小数点数」を計算するための関数が提供されています。
func Nextafter32(x, y float32) float32
:x
からy
の方向へ向かって、x
の次に表現可能なfloat32
値を返します。func Nextafter(x, y float64) float64
:x
からy
の方向へ向かって、x
の次に表現可能なfloat64
値を返します。
これらの関数は、x
とy
が同じ値の場合にはx
を返します。また、NaN
(非数)が引数に含まれる場合も特別な挙動を示します。
技術的詳細
このコミットの技術的な核心は、math
パッケージ内のNextafter64
関数の削除と、その機能のNextafter
関数への統合です。
変更前は、src/pkg/math/nextafter.go
には以下の3つの関数が存在していました。
Nextafter32(x, y float32) float32
:float32
用の実装。Nextafter64(x, y float64) float64
:float64
用の実際の計算ロジックを持つ実装。Nextafter(x, y float64) float64
:Nextafter64(x, y)
を呼び出すエイリアス関数。
この構造は、Nextafter
という名前がfloat64
専用のエイリアスであるという点で、やや直感的ではありませんでした。Goの標準ライブラリでは、通常、型固有の関数には型サフィックス(例: 32
)を付け、型サフィックスがない関数はfloat64
を扱うのが慣例です。
今回の変更では、以下のステップが実行されました。
Nextafter64
関数の名前をNextafter
に変更しました。これにより、Nextafter
がfloat64
の「次の表現可能な浮動小数点数」を計算する本来の関数となります。- 以前の
Nextafter
エイリアス関数を削除しました。これはもはや不要になったためです。 src/pkg/math/all_test.go
およびsrc/pkg/math/big/rat_test.go
内のNextafter64
へのすべての参照をNextafter
に更新しました。これにより、テストコードも新しいAPIに準拠します。
この変更により、math
パッケージのAPIはより一貫性のあるものとなり、float64
のNextafter
機能はmath.Nextafter
として直接利用できるようになりました。float32
の機能は引き続きmath.Nextafter32
として提供されます。
コアとなるコードの変更箇所
src/pkg/math/nextafter.go
における変更が最も重要です。
--- a/src/pkg/math/nextafter.go
+++ b/src/pkg/math/nextafter.go
@@ -25,12 +25,12 @@ func Nextafter32(x, y float32) (r float32) {
return
}
-// Nextafter64 returns the next representable float64 value after x towards y.
+// Nextafter returns the next representable float64 value after x towards y.
// Special cases:
// Nextafter64(x, x) = x
// Nextafter64(NaN, y) = NaN
// Nextafter64(x, NaN) = NaN
-func Nextafter64(x, y float64) (r float64) {
+func Nextafter(x, y float64) (r float64) {
switch {
case IsNaN(x) || IsNaN(y): // special case
r = NaN()
@@ -45,9 +45,3 @@ func Nextafter64(x, y float64) (r float64) {
}
return
}
-
-// Nextafter is the same as Nextafter64.
-// It is provided for backward-compatibility only.
-func Nextafter(x, y float64) float64 {
- return Nextafter64(x, y)
-}
コアとなるコードの解説
上記のdiffは、src/pkg/math/nextafter.go
ファイルにおける主要な変更を示しています。
-
Nextafter64
関数のリネーム:- 変更前:
func Nextafter64(x, y float64) (r float64)
- 変更後:
func Nextafter(x, y float64) (r float64)
- これにより、
float64
の「次の表現可能な浮動小数点数」を計算する実際のロジックを持つ関数がNextafter
という名前に変更されました。関数のコメントもNextafter64
からNextafter
に更新され、この関数の目的が明確に示されています。
- 変更前:
-
Nextafter
エイリアス関数の削除:- 変更前には、以下のエイリアス関数が存在していました。
// Nextafter is the same as Nextafter64. // It is provided for backward-compatibility only. func Nextafter(x, y float64) float64 { return Nextafter64(x, y) }
- このエイリアス関数は、
Nextafter64
がNextafter
にリネームされたことで不要になったため、完全に削除されました。
- 変更前には、以下のエイリアス関数が存在していました。
この変更により、math
パッケージのユーザーは、float64
のNextafter
機能を利用する際に、直接math.Nextafter(x, y)
を呼び出すことになります。これは、math.Nextafter32(x, y)
と並んで、型に応じた明確な関数名を提供し、APIの統一性を高めます。
テストファイル(src/pkg/math/all_test.go
とsrc/pkg/math/big/rat_test.go
)では、Nextafter64
への呼び出しがすべてNextafter
に置き換えられています。これは、APIの変更に伴う必然的な修正であり、新しい関数名が正しく使用されていることを確認するためのものです。
関連リンク
- Go Change List: https://golang.org/cl/104050045
参考にした情報源リンク
- この解説は、提供されたコミット情報(コミットメッセージ、変更されたファイル、diff)に基づいて作成されました。
- Go言語の
math
パッケージのドキュメント(一般的なNextafter
関数の動作理解のため)。 - IEEE 754 浮動小数点数標準に関する一般的な知識。# [インデックス 19516] ファイルの概要
このコミットは、Go言語のmath
パッケージにおける浮動小数点数操作関数Nextafter
およびNextafter64
に関する変更です。具体的には、float64
型に対する「次の表現可能な浮動小数点数」を計算する関数Nextafter64
が、既存のNextafter
関数に統合され、Nextafter64
という名前のエイリアスが削除されました。これにより、コードの重複が解消され、APIが簡素化されています。変更は主にsrc/pkg/math/nextafter.go
、src/pkg/math/all_test.go
、およびsrc/pkg/math/big/rat_test.go
に及びます。
コミット
- コミットハッシュ:
3d68dc332517d7f6ef38d42e9a3211655958b20b
- 作者: Robert Griesemer gri@golang.org
- コミット日時: Wed Jun 11 14:24:16 2014 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3d68dc332517d7f6ef38d42e9a3211655958b20b
元コミット内容
math: remove Nextafter64 alias in favor of existing Nextafter
LGTM=adonovan
R=rsc, adonovan
CC=golang-codereviews
https://golang.org/cl/104050045
変更の背景
この変更の背景には、Go言語の標準ライブラリにおけるAPIの整合性と簡潔性の追求があります。元々、math
パッケージにはfloat32
用のNextafter32
とfloat64
用のNextafter64
が存在していました。しかし、Nextafter
という関数名も存在し、これはNextafter64
のエイリアスとして機能していました。
このような状況は、以下の点で問題がありました。
- 冗長性:
Nextafter
とNextafter64
が同じ機能を提供しており、冗長でした。 - 混乱の可能性: ユーザーがどちらの関数を使うべきか迷う可能性がありました。特に、
Nextafter
という名前がfloat64
専用であるということが直感的に分かりにくい場合がありました。 - APIの統一性:
math
パッケージ内の他の関数(例:Abs
,Sqrt
など)は、引数がfloat64
の場合に型サフィックスなしで提供されるのが一般的です。Nextafter64
という名前は、この命名規則から逸脱していました。
このコミットは、Nextafter64
を削除し、その機能を既存のNextafter
関数に統合することで、これらの問題を解決し、APIをよりクリーンで一貫性のあるものにすることを目的としています。これにより、float64
の「次の表現可能な浮動小数点数」を取得する際には、シンプルにmath.Nextafter
を使用するようになります。
前提知識の解説
浮動小数点数 (IEEE 754)
コンピュータにおける浮動小数点数は、実数を近似的に表現するための形式です。Go言語では、float32
(単精度、32ビット)とfloat64
(倍精度、64ビット)の2種類の浮動小数点数型がIEEE 754標準に準拠して実装されています。
IEEE 754標準では、浮動小数点数は符号部、指数部、仮数部で構成されます。この表現形式により、非常に広い範囲の数値を表現できますが、その精度には限界があります。特に、連続する実数値を正確に表現できるわけではなく、特定の離散的な値のみを表現できます。
次の表現可能な浮動小数点数 (Next Representable Floating-Point Value)
浮動小数点数の特性として、ある数値の次に大きい(または小さい)表現可能な数値は、その数値に非常に近いですが、完全に連続しているわけではありません。この「次に表現可能な浮動小数点数」を見つけることは、数値計算の精度分析、誤差伝播の理解、または特定のアルゴリズム(例: 区間演算)の実装において重要です。
例えば、1.0
の次に大きいfloat64
値は1.0000000000000002
であり、その差は非常に小さいですが、有限の精度を持つ浮動小数点数演算ではこの「ギャップ」が重要になります。
math.Nextafter
関数
Go言語のmath
パッケージには、この「次の表現可能な浮動小数点数」を計算するための関数が提供されています。
func Nextafter32(x, y float32) float32
:x
からy
の方向へ向かって、x
の次に表現可能なfloat32
値を返します。func Nextafter(x, y float64) float64
:x
からy
の方向へ向かって、x
の次に表現可能なfloat64
値を返します。
これらの関数は、x
とy
が同じ値の場合にはx
を返します。また、NaN
(非数)が引数に含まれる場合も特別な挙動を示します。
技術的詳細
このコミットの技術的な核心は、math
パッケージ内のNextafter64
関数の削除と、その機能のNextafter
関数への統合です。
変更前は、src/pkg/math/nextafter.go
には以下の3つの関数が存在していました。
Nextafter32(x, y float32) float32
:float32
用の実装。Nextafter64(x, y float64) float64
:float64
用の実際の計算ロジックを持つ実装。Nextafter(x, y float64) float64
:Nextafter64(x, y)
を呼び出すエイリアス関数。
この構造は、Nextafter
という名前がfloat64
専用のエイリアスであるという点で、やや直感的ではありませんでした。Goの標準ライブラリでは、通常、型固有の関数には型サフィックス(例: 32
)を付け、型サフィックスがない関数はfloat64
を扱うのが慣例です。
今回の変更では、以下のステップが実行されました。
Nextafter64
関数の名前をNextafter
に変更しました。これにより、Nextafter
がfloat64
の「次の表現可能な浮動小数点数」を計算する本来の関数となります。- 以前の
Nextafter
エイリアス関数を削除しました。これはもはや不要になったためです。 src/pkg/math/all_test.go
およびsrc/pkg/math/big/rat_test.go
内のNextafter64
へのすべての参照をNextafter
に更新しました。これにより、テストコードも新しいAPIに準拠します。
この変更により、math
パッケージのAPIはより一貫性のあるものとなり、float64
のNextafter
機能はmath.Nextafter
として直接利用できるようになりました。float32
の機能は引き続きmath.Nextafter32
として提供されます。
コアとなるコードの変更箇所
src/pkg/math/nextafter.go
における変更が最も重要です。
--- a/src/pkg/math/nextafter.go
+++ b/src/pkg/math/nextafter.go
@@ -25,12 +25,12 @@ func Nextafter32(x, y float32) (r float32) {
return
}
-// Nextafter64 returns the next representable float64 value after x towards y.
+// Nextafter returns the next representable float64 value after x towards y.
// Special cases:
// Nextafter64(x, x) = x
// Nextafter64(NaN, y) = NaN
// Nextafter64(x, NaN) = NaN
-func Nextafter64(x, y float64) (r float64) {
+func Nextafter(x, y float64) (r float64) {
switch {
case IsNaN(x) || IsNaN(y): // special case
r = NaN()
@@ -45,9 +45,3 @@ func Nextafter64(x, y float64) (r float64) {
}
return
}
-
-// Nextafter is the same as Nextafter64.
-// It is provided for backward-compatibility only.
-func Nextafter(x, y float64) float64 {
- return Nextafter64(x, y)
-}
コアとなるコードの解説
上記のdiffは、src/pkg/math/nextafter.go
ファイルにおける主要な変更を示しています。
-
Nextafter64
関数のリネーム:- 変更前:
func Nextafter64(x, y float64) (r float64)
- 変更後:
func Nextafter(x, y float64) (r float64)
- これにより、
float64
の「次の表現可能な浮動小数点数」を計算する実際のロジックを持つ関数がNextafter
という名前に変更されました。関数のコメントもNextafter64
からNextafter
に更新され、この関数の目的が明確に示されています。
- 変更前:
-
Nextafter
エイリアス関数の削除:- 変更前には、以下のエイリアス関数が存在していました。
// Nextafter is the same as Nextafter64. // It is provided for backward-compatibility only. func Nextafter(x, y float64) float64 { return Nextafter64(x, y) }
- このエイリアス関数は、
Nextafter64
がNextafter
にリネームされたことで不要になったため、完全に削除されました。
- 変更前には、以下のエイリアス関数が存在していました。
この変更により、math
パッケージのユーザーは、float64
のNextafter
機能を利用する際に、直接math.Nextafter(x, y)
を呼び出すことになります。これは、math.Nextafter32(x, y)
と並んで、型に応じた明確な関数名を提供し、APIの統一性を高めます。
テストファイル(src/pkg/math/all_test.go
とsrc/pkg/math/big/rat_test.go
)では、Nextafter64
への呼び出しがすべてNextafter
に置き換えられています。これは、APIの変更に伴う必然的な修正であり、新しい関数名が正しく使用されていることを確認するためのものです。
関連リンク
- Go Change List: https://golang.org/cl/104050045
参考にした情報源リンク
- この解説は、提供されたコミット情報(コミットメッセージ、変更されたファイル、diff)に基づいて作成されました。
- Go言語の
math
パッケージのドキュメント(一般的なNextafter
関数の動作理解のため)。 - IEEE 754 浮動小数点数標準に関する一般的な知識。