[インデックス 10529] ファイルの概要
このコミットでは、Go言語の標準ライブラリである src/pkg/math
パッケージ内の複数のファイルのコメントが更新されています。具体的には、浮動小数点数の特殊なケース(無限大 Inf
)に関する記述において、+Inf
と -Inf
を個別に記述していた箇所が、数学記号の ±
を用いて ±Inf
と簡潔に表現するように変更されています。
変更されたファイルは以下の通りです。
src/pkg/math/abs.go
src/pkg/math/asinh.go
src/pkg/math/floor.go
src/pkg/math/gamma.go
src/pkg/math/modf.go
src/pkg/math/sincos.go
コミット
commit c8d2544b269bb4ece49d4804845c3e64b32cd7e5
Author: Charles L. Dorian <cldorian@gmail.com>
Date: Mon Nov 28 13:04:52 2011 -0800
math: update special-conditions comments to use ± symbol
R=rsc, golang-dev, r
CC=golang-dev
https://golang.org/cl/5445046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c8d2544b269bb4ece49d4804845c3e64b32cd7e5
元コミット内容
math: update special-conditions comments to use ± symbol
変更の背景
このコミットの背景には、Go言語の標準ライブラリにおけるドキュメンテーションの一貫性と簡潔性の向上が挙げられます。math
パッケージ内の関数は、浮動小数点数の特殊な値(無限大 Inf
や非数 NaN
)が入力された場合の挙動を「Special cases」としてコメントで明記しています。
以前の記述では、正の無限大 (+Inf
) と負の無限大 (-Inf
) が同じ結果を返す場合でも、それぞれを個別の行で記述していました。これは冗長であり、コメントの可読性を低下させる可能性がありました。
このコミットは、このような冗長な記述を避けるため、数学で一般的に用いられる ±
(プラスマイナス)記号を導入し、+Inf
と -Inf
の両方をまとめて ±Inf
と表現することで、コメントをより簡潔かつ正確に、そして数学的な慣習に沿った形に統一することを目的としています。これにより、ドキュメントがより読みやすくなり、開発者が関数の特殊な挙動を素早く理解できるようになります。
前提知識の解説
浮動小数点数の特殊な値 (IEEE 754)
コンピュータにおける浮動小数点数は、IEEE 754標準によって定義されており、通常の数値の他にいくつかの特殊な値を表現できます。
- 無限大 (Infinity, Inf): 非常に大きな数や、ゼロ除算の結果など、計算結果が数値の表現範囲を超える場合に発生します。正の無限大 (
+Inf
) と負の無限大 (-Inf
) があります。- 例:
1.0 / 0.0
は+Inf
、-1.0 / 0.0
は-Inf
となります。
- 例:
- 非数 (Not a Number, NaN): 不定形な演算の結果(例:
0.0 / 0.0
、Inf - Inf
、Inf * 0.0
、sqrt(-1)
)や、無効な操作の結果として発生します。NaN
は、それ自身を含むいかなる値とも等しくありません(NaN == NaN
はfalse
)。
Go言語の math
パッケージでは、これらの特殊な値に対する関数の挙動が明確に定義されており、ドキュメンテーションコメントで「Special cases」として記述されています。
±
(プラスマイナス) 記号
±
記号は数学で広く使われる記号で、「プラスまたはマイナス」を意味します。これは、ある値が正の値と負の値の両方を取りうることを簡潔に示すために使用されます。
例えば、「x = ±5
」は「x = 5
または x = -5
」を意味します。このコミットでは、+Inf
と -Inf
の両方が同じ結果をもたらす場合に、±Inf
と記述することで、2つのケースを1行で表現しています。これにより、コメントがより簡潔になり、数学的な表現に近づいています。
技術的詳細
このコミットは、Go言語の math
パッケージ内の関数のドキュメンテーションコメントの変更に限定されており、実際の関数のロジックや計算結果には影響を与えません。変更の核心は、コメントの記述スタイルを改善し、より数学的に正確で簡潔な表現を用いることにあります。
具体的には、以下のパターンでコメントが変更されています。
// Abs(+Inf) = +Inf
// Abs(-Inf) = +Inf
↓// Abs(±Inf) = +Inf
これは、Abs
関数(絶対値を返す関数)において、正の無限大の絶対値も負の無限大の絶対値も、どちらも正の無限大になるという事実を、±Inf
という単一の表現でカバーしています。
同様に、Asinh
(逆双曲線正弦)、Floor
(床関数)、Ceil
(天井関数)、Trunc
(切り捨て)、Gamma
(ガンマ関数)、Modf
(整数部と小数部の分離)、Sincos
(正弦と余弦を同時に返す)といった関数においても、+Inf
と -Inf
がそれぞれ特定の同じ結果を返す場合に、±Inf
を用いてコメントが統一されています。
この変更は、コードの保守性や理解度を高める上で重要です。特に、数学的な関数を扱うライブラリにおいては、ドキュメンテーションが数学的な慣習に沿っていることが、利用者の理解を助け、誤解を防ぐ上で役立ちます。
コアとなるコードの変更箇所
以下に、各ファイルにおける具体的な変更箇所を示します。
src/pkg/math/abs.go
--- a/src/pkg/math/abs.go
+++ b/src/pkg/math/abs.go
@@ -7,8 +7,7 @@ package math
// Abs returns the absolute value of x.
//
// Special cases are:
-// Abs(+Inf) = +Inf
-// Abs(-Inf) = +Inf
+// Abs(±Inf) = +Inf
// Abs(NaN) = NaN
func Abs(x float64) float64 {
switch {
src/pkg/math/asinh.go
--- a/src/pkg/math/asinh.go
+++ b/src/pkg/math/asinh.go
@@ -33,8 +33,7 @@ package math
// Asinh(x) calculates the inverse hyperbolic sine of x.
//
// Special cases are:
-// Asinh(+Inf) = +Inf
-// Asinh(-Inf) = -Inf
+// Asinh(±Inf) = ±Inf
// Asinh(NaN) = NaN
func Asinh(x float64) float64 {
const (
src/pkg/math/floor.go
--- a/src/pkg/math/floor.go
+++ b/src/pkg/math/floor.go
@@ -7,8 +7,7 @@ package math
// Floor returns the greatest integer value less than or equal to x.
//
// Special cases are:
-// Floor(+Inf) = +Inf
-// Floor(-Inf) = -Inf
+// Floor(±Inf) = ±Inf
// Floor(NaN) = NaN
func Floor(x float64) float64 {
// TODO(rsc): Remove manual inlining of IsNaN, IsInf
@@ -30,16 +29,14 @@ func Floor(x float64) float64 {\n // Ceil returns the least integer value greater than or equal to x.\n //
// Special cases are:
-// Ceil(+Inf) = +Inf
-// Ceil(-Inf) = -Inf
+// Ceil(±Inf) = ±Inf
// Ceil(NaN) = NaN
func Ceil(x float64) float64 { return -Floor(-x) }\n \n // Trunc returns the integer value of x.\n //
// Special cases are:
-// Trunc(+Inf) = +Inf
-// Trunc(-Inf) = -Inf
+// Trunc(±Inf) = ±Inf
// Trunc(NaN) = NaN
func Trunc(x float64) float64 {
// TODO(rsc): Remove manual inlining of IsNaN, IsInf
src/pkg/math/gamma.go
--- a/src/pkg/math/gamma.go
+++ b/src/pkg/math/gamma.go
@@ -113,8 +113,7 @@ func stirling(x float64) float64 {\n // Gamma(x) returns the Gamma function of x.\n //
// Special cases are:
-// Gamma(Inf) = Inf
-// Gamma(-Inf) = -Inf
+// Gamma(±Inf) = ±Inf
// Gamma(NaN) = NaN
// Large values overflow to +Inf.
// Negative integer values equal ±Inf.
src/pkg/math/modf.go
--- a/src/pkg/math/modf.go
+++ b/src/pkg/math/modf.go
@@ -8,8 +8,7 @@ package math
// that sum to f. Both values have the same sign as f.\n //
// Special cases are:
-// Modf(+Inf) = +Inf, NaN
-// Modf(-Inf) = -Inf, NaN
+// Modf(±Inf) = ±Inf, NaN
// Modf(NaN) = NaN, NaN
func Modf(f float64) (int float64, frac float64) {
if f < 1 {
src/pkg/math/sincos.go
--- a/src/pkg/math/sincos.go
+++ b/src/pkg/math/sincos.go
@@ -7,7 +7,6 @@ package math
// Sincos(x) returns Sin(x), Cos(x).\n //
// Special conditions are:
-// Sincos(+Inf) = NaN, NaN
-// Sincos(-Inf) = NaN, NaN
+// Sincos(±Inf) = NaN, NaN
// Sincos(NaN) = NaN, NaN
func Sincos(x float64) (sin, cos float64) { return Sin(x), Cos(x) }\n
コアとなるコードの解説
このコミットにおける「コアとなるコードの変更」は、Go言語の math
パッケージ内の各関数のドキュメンテーションコメントに限定されています。実際の関数の実装ロジックや計算アルゴリズム自体は変更されていません。
変更の意図は、浮動小数点数の特殊な値(特に無限大 Inf
)に対する関数の挙動を説明するコメントを、より簡潔で数学的に一般的な表記に統一することです。
各ファイルの変更内容を具体的に見ていきます。
-
Abs(x float64) float64
(abs.go):Abs
関数は絶対値を返します。+Inf
の絶対値も-Inf
の絶対値も+Inf
となります。- 変更前:
Abs(+Inf) = +Inf
とAbs(-Inf) = +Inf
の2行で記述。 - 変更後:
Abs(±Inf) = +Inf
の1行で記述。これにより、両方の無限大が同じ結果になることを簡潔に示しています。
-
Asinh(x float64) float64
(asinh.go):Asinh
関数は逆双曲線正弦を計算します。+Inf
の逆双曲線正弦は+Inf
、-Inf
の逆双曲線正弦は-Inf
となります。- 変更前:
Asinh(+Inf) = +Inf
とAsinh(-Inf) = -Inf
の2行で記述。 - 変更後:
Asinh(±Inf) = ±Inf
の1行で記述。入力の符号が結果の符号に引き継がれることを示しています。
-
Floor(x float64) float64
(floor.go):Floor
関数はx
以下の最大の整数値を返します。+Inf
の床関数は+Inf
、-Inf
の床関数は-Inf
となります。- 変更前:
Floor(+Inf) = +Inf
とFloor(-Inf) = -Inf
の2行で記述。 - 変更後:
Floor(±Inf) = ±Inf
の1行で記述。
-
Ceil(x float64) float64
(floor.go):Ceil
関数はx
以上の最小の整数値を返します。+Inf
の天井関数は+Inf
、-Inf
の天井関数は-Inf
となります。- 変更前:
Ceil(+Inf) = +Inf
とCeil(-Inf) = -Inf
の2行で記述。 - 変更後:
Ceil(±Inf) = ±Inf
の1行で記述。
-
Trunc(x float64) float64
(floor.go):Trunc
関数はx
の整数値を返します(小数部を切り捨て)。+Inf
の切り捨ては+Inf
、-Inf
の切り捨ては-Inf
となります。- 変更前:
Trunc(+Inf) = +Inf
とTrunc(-Inf) = -Inf
の2行で記述。 - 変更後:
Trunc(±Inf) = ±Inf
の1行で記述。
-
Gamma(x float64) float64
(gamma.go):Gamma
関数はガンマ関数を計算します。+Inf
のガンマ関数は+Inf
、-Inf
のガンマ関数は-Inf
となります。- 変更前:
Gamma(Inf) = Inf
とGamma(-Inf) = -Inf
の2行で記述(ここではInf
が+Inf
を指していると解釈できます)。 - 変更後:
Gamma(±Inf) = ±Inf
の1行で記述。
-
Modf(f float64) (int float64, frac float64)
(modf.go):Modf
関数は浮動小数点数を整数部と小数部に分離します。+Inf
の場合、整数部は+Inf
、小数部はNaN
。-Inf
の場合、整数部は-Inf
、小数部はNaN
となります。- 変更前:
Modf(+Inf) = +Inf, NaN
とModf(-Inf) = -Inf, NaN
の2行で記述。 - 変更後:
Modf(±Inf) = ±Inf, NaN
の1行で記述。整数部の符号が入力の符号に依存することを示しています。
-
Sincos(x float64) (sin, cos float64)
(sincos.go):Sincos
関数は正弦と余弦を同時に返します。+Inf
および-Inf
の場合、両方ともNaN
となります。- 変更前:
Sincos(+Inf) = NaN, NaN
とSincos(-Inf) = NaN, NaN
の2行で記述。 - 変更後:
Sincos(±Inf) = NaN, NaN
の1行で記述。
これらの変更は、Go言語のドキュメンテーションにおける品質と一貫性を向上させるための小さな、しかし重要な改善です。
関連リンク
- Go CL 5445046: https://golang.org/cl/5445046
参考にした情報源リンク
- IEEE 754 - Wikipedia: https://ja.wikipedia.org/wiki/IEEE_754
- プラスマイナス記号 - Wikipedia: https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%82%B9%E3%83%9E%E3%82%A4%E3%83%8A%E3%82%B9%E8%A8%98%E5%8F%B7
- Go言語の
math
パッケージのドキュメンテーション (Go公式ドキュメント): https://pkg.go.dev/math (一般的な情報源として)