[インデックス 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 浮動小数点数標準に関する一般的な知識。