Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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.0Inf - InfInf * 0.0sqrt(-1))や、無効な操作の結果として発生します。NaN は、それ自身を含むいかなる値とも等しくありません(NaN == NaNfalse)。

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) = +InfAbs(-Inf) = +Inf の2行で記述。
    • 変更後: Abs(±Inf) = +Inf の1行で記述。これにより、両方の無限大が同じ結果になることを簡潔に示しています。
  • Asinh(x float64) float64 (asinh.go):

    • Asinh 関数は逆双曲線正弦を計算します。+Inf の逆双曲線正弦は +Inf-Inf の逆双曲線正弦は -Inf となります。
    • 変更前: Asinh(+Inf) = +InfAsinh(-Inf) = -Inf の2行で記述。
    • 変更後: Asinh(±Inf) = ±Inf の1行で記述。入力の符号が結果の符号に引き継がれることを示しています。
  • Floor(x float64) float64 (floor.go):

    • Floor 関数は x 以下の最大の整数値を返します。+Inf の床関数は +Inf-Inf の床関数は -Inf となります。
    • 変更前: Floor(+Inf) = +InfFloor(-Inf) = -Inf の2行で記述。
    • 変更後: Floor(±Inf) = ±Inf の1行で記述。
  • Ceil(x float64) float64 (floor.go):

    • Ceil 関数は x 以上の最小の整数値を返します。+Inf の天井関数は +Inf-Inf の天井関数は -Inf となります。
    • 変更前: Ceil(+Inf) = +InfCeil(-Inf) = -Inf の2行で記述。
    • 変更後: Ceil(±Inf) = ±Inf の1行で記述。
  • Trunc(x float64) float64 (floor.go):

    • Trunc 関数は x の整数値を返します(小数部を切り捨て)。+Inf の切り捨ては +Inf-Inf の切り捨ては -Inf となります。
    • 変更前: Trunc(+Inf) = +InfTrunc(-Inf) = -Inf の2行で記述。
    • 変更後: Trunc(±Inf) = ±Inf の1行で記述。
  • Gamma(x float64) float64 (gamma.go):

    • Gamma 関数はガンマ関数を計算します。+Inf のガンマ関数は +Inf-Inf のガンマ関数は -Inf となります。
    • 変更前: Gamma(Inf) = InfGamma(-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, NaNModf(-Inf) = -Inf, NaN の2行で記述。
    • 変更後: Modf(±Inf) = ±Inf, NaN の1行で記述。整数部の符号が入力の符号に依存することを示しています。
  • Sincos(x float64) (sin, cos float64) (sincos.go):

    • Sincos 関数は正弦と余弦を同時に返します。+Inf および -Inf の場合、両方とも NaN となります。
    • 変更前: Sincos(+Inf) = NaN, NaNSincos(-Inf) = NaN, NaN の2行で記述。
    • 変更後: Sincos(±Inf) = NaN, NaN の1行で記述。

これらの変更は、Go言語のドキュメンテーションにおける品質と一貫性を向上させるための小さな、しかし重要な改善です。

関連リンク

参考にした情報源リンク