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

[インデックス 10611] ファイルの概要

このコミットは、Go言語の標準ライブラリmathパッケージ内の双曲線関数(SinhTanh)およびその他の三角関数(CosSincosTan)のドキュメンテーションを改善するものです。具体的には、これらの関数の「特殊な条件 (Special conditions)」に関するコメントを「特殊なケース (Special cases)」というより一貫性のある表現に修正し、SinhTanh関数には、入力が±0±Inf(無限大)、NaN(非数)の場合の挙動を明示するコメントを追加しています。これにより、関数の振る舞いがより明確になり、利用者がこれらのエッジケースを理解しやすくなります。

コミット

commit abc7df9686839950f3a2ce108a5a683cce9001fe
Author: Charles L. Dorian <cldorian@gmail.com>
Date:   Mon Dec 5 14:01:24 2011 -0500

    math: add special-cases comments to Sinh and Tanh.
    
    Also change "Special conditions" to "Special cases" as in other functions.
    
    R=rsc, golang-dev
    CC=golang-dev
    https://golang.org/cl/5440078

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/abc7df9686839950f3a2ce108a5a683cce9001fe

元コミット内容

このコミットの目的は、Go言語のmathパッケージにおいて、Sinh(双曲線正弦)およびTanh(双曲線正接)関数に、特殊な入力値(±0±InfNaN)に対する挙動を説明するコメントを追加することです。また、既存のCosSincosTan関数における「Special conditions」という表現を、他の関数との一貫性を保つために「Special cases」に変更しています。

変更の背景

数値計算を行う関数、特に浮動小数点数を扱う関数においては、通常の数値入力だけでなく、±0(符号付きゼロ)、±Inf(無限大)、NaN(非数)といった特殊な浮動小数点値が入力された場合の挙動を明確に定義し、ドキュメント化することが非常に重要です。これは、これらの特殊な値が計算結果に予期せぬ影響を与える可能性があるためです。

このコミットが行われた背景には、Go言語のmathパッケージのドキュメンテーションの品質と一貫性を向上させるという目的があります。既存の関数では既に「Special cases」としてこれらの挙動が記述されているものがありましたが、SinhTanhといった一部の関数ではこの情報が欠落していました。また、「Special conditions」という表現が使われている箇所があり、これを「Special cases」に統一することで、ドキュメンテーション全体の一貫性を高める狙いがありました。

これにより、開発者がmathパッケージの関数を使用する際に、特殊な入力値に対する関数の振る舞いを容易に把握できるようになり、より堅牢な数値計算コードを記述する助けとなります。

前提知識の解説

浮動小数点数の特殊な値 (IEEE 754)

現代のコンピュータにおける浮動小数点数の表現は、ほとんどの場合IEEE 754標準に従っています。この標準では、通常の数値に加えて以下の特殊な値を定義しています。

  • ゼロ (±0): 正のゼロと負のゼロが存在します。多くの計算では同じように扱われますが、一部の関数(例: 1/x)では符号が結果に影響を与えることがあります。
  • 無限大 (±Inf): +Inf(正の無限大)と-Inf(負の無限大)が存在します。これは、オーバーフロー(数値が表現可能な最大値を超える)やゼロ除算(例: 1.0/0.0)の結果として生じます。
  • 非数 (NaN - Not a Number): 不定形な演算(例: 0.0/0.0Inf - InfInf * 0sqrt(-1))の結果として生じる値です。NaNは他のいかなる値とも等しくなく、NaN == NaNfalseになります。NaNを含む演算の結果は、通常NaNになります(NaN伝播)。

これらの特殊な値に対する関数の挙動を明示することは、数値計算の正確性と予測可能性を保証するために不可欠です。

双曲線関数 (Hyperbolic Functions)

双曲線関数は、通常の三角関数(正弦、余弦など)が単位円上の点と関連付けられるのと同様に、単位双曲線上の点と関連付けられる数学関数です。主な双曲線関数には以下のものがあります。

  • 双曲線正弦 (Sinh): sinh(x) = (e^x - e^-x) / 2
  • 双曲線余弦 (Cosh): cosh(x) = (e^x + e^-x) / 2
  • 双曲線正接 (Tanh): tanh(x) = sinh(x) / cosh(x) = (e^x - e^-x) / (e^x + e^-x)

これらの関数は、物理学、工学、統計学など、様々な分野で応用されます。Go言語のmathパッケージは、これらの関数の実装を提供しています。

Go言語の math パッケージ

Go言語の標準ライブラリには、基本的な数学関数を提供するmathパッケージが含まれています。このパッケージは、浮動小数点数(float64型)を主に対象とし、三角関数、指数関数、対数関数、双曲線関数、丸め関数など、幅広い機能を提供します。mathパッケージの関数は、IEEE 754標準に準拠した浮動小数点演算の特殊なケースを適切に処理するように設計されています。

技術的詳細

このコミットの技術的詳細は、主にGo言語のドキュメンテーションコメントの追加と修正にあります。

  1. 「Special conditions」から「Special cases」への変更: これは、ドキュメンテーションの一貫性を高めるための単純な文字列置換です。mathパッケージ内の他の多くの関数では、特殊な入力値に対する挙動を説明する際に「Special cases」という表現が使われていました。この変更により、パッケージ全体のドキュメンテーションスタイルが統一され、利用者が情報を探しやすくなります。

  2. SinhおよびTanh関数への特殊ケースコメントの追加: これは、関数の契約(コントラクト)を明確にする上で非常に重要な変更です。

    • Sinh(x):
      • Sinh(±0) = ±0: 入力が正または負のゼロの場合、結果も同じ符号のゼロになります。
      • Sinh(±Inf) = ±Inf: 入力が正または負の無限大の場合、結果も同じ符号の無限大になります。
      • Sinh(NaN) = NaN: 入力が非数の場合、結果も非数になります(NaN伝播)。
    • Cosh(x):
      • Cosh(±0) = 1: 入力が正または負のゼロの場合、結果は1になります。
      • Cosh(±Inf) = +Inf: 入力が正または負の無限大の場合、結果は正の無限大になります。
      • Cosh(NaN) = NaN: 入力が非数の場合、結果も非数になります。
    • Tanh(x):
      • Tanh(±0) = ±0: 入力が正または負のゼロの場合、結果も同じ符号のゼロになります。
      • Tanh(±Inf) = ±1: 入力が正の無限大の場合結果は+1、負の無限大の場合結果は-1になります。
      • Tanh(NaN) = NaN: 入力が非数の場合、結果も非数になります。

これらのコメントは、関数の実装自体を変更するものではなく、その振る舞いを正確に記述することで、APIの利用者がこれらのエッジケースを考慮したコードを書けるようにするためのものです。特に、浮動小数点演算では、これらの特殊な値が連鎖的に計算結果に影響を与える可能性があるため、関数のドキュメンテーションで明示することはベストプラクティスとされています。

コアとなるコードの変更箇所

diff --git a/src/pkg/math/sin.go b/src/pkg/math/sin.go
index 9e553a268b..b2a3f8a4e0 100644
--- a/src/pkg/math/sin.go
+++ b/src/pkg/math/sin.go
@@ -110,7 +110,7 @@ var _cos = [...]float64{\n 
 // Cos returns the cosine of x.
 //
-// Special conditions are:
+// Special cases are:
 //	Cos(±Inf) = NaN
 //	Cos(NaN) = NaN
 func Cos(x float64) float64 {
diff --git a/src/pkg/math/sincos.go b/src/pkg/math/sincos.go
index f5412fd726..74294256be 100644
--- a/src/pkg/math/sincos.go
+++ b/src/pkg/math/sincos.go
@@ -8,7 +8,7 @@ package math
 
 // Sincos(x) returns Sin(x), Cos(x).
 //
-// Special conditions are:
+// Special cases are:
 //	Sincos(±0) = ±0, 1
 //	Sincos(±Inf) = NaN, NaN
 //	Sincos(NaN) = NaN, NaN
diff --git a/src/pkg/math/sinh.go b/src/pkg/math/sinh.go
index eaf28a51cd..139b911fe6 100644
--- a/src/pkg/math/sinh.go
+++ b/src/pkg/math/sinh.go
@@ -17,6 +17,11 @@ package math
 */
 
 // Sinh returns the hyperbolic sine of x.
+//
+// Special cases are:
+//	Sinh(±0) = ±0
+//	Sinh(±Inf) = ±Inf
+//	Sinh(NaN) = NaN
 func Sinh(x float64) float64 {
 	// The coefficients are #2029 from Hart & Cheney. (20.36D)
 	const (
@@ -56,6 +61,11 @@ func Sinh(x float64) float64 {
 }
 
 // Cosh returns the hyperbolic cosine of x.
+//
+// Special cases are:
+//	Cosh(±0) = 1
+//	Cosh(±Inf) = +Inf
+//	Cosh(NaN) = NaN
 func Cosh(x float64) float64 {
  	if x < 0 {
  		x = -x
diff --git a/src/pkg/math/tan.go b/src/pkg/math/tan.go
index 739ee80f76..76131fcd93 100644
--- a/src/pkg/math/tan.go
+++ b/src/pkg/math/tan.go
@@ -75,7 +75,7 @@ var _tanQ = [...]float64{\n 
 // Tan returns the tangent of x.
 //
-// Special conditions are:
+// Special cases are:
 //	Tan(±0) = ±0
 //	Tan(±Inf) = NaN
 //	Tan(NaN) = NaN
diff --git a/src/pkg/math/tanh.go b/src/pkg/math/tanh.go
index f4a8a5a4d6..03a641b4da 100644
--- a/src/pkg/math/tanh.go
+++ b/src/pkg/math/tanh.go
@@ -12,6 +12,11 @@ package math
 */
 
 // Tanh computes the hyperbolic tangent of x.
+//
+// Special cases are:
+//	Tanh(±0) = ±0
+//	Tanh(±Inf) = ±1
+//	Tanh(NaN) = NaN
 func Tanh(x float64) float64 {
  	if x < 0 {
  		x = -x

コアとなるコードの解説

上記のdiff出力は、Go言語のsrc/pkg/mathディレクトリ内の複数のファイルに対する変更を示しています。

  • src/pkg/math/sin.go (Cos関数), src/pkg/math/sincos.go (Sincos関数), src/pkg/math/tan.go (Tan関数): これらのファイルでは、関数のドキュメンテーションコメント内の「Special conditions are:」という記述が「Special cases are:」に修正されています。これは、Go言語のドキュメンテーションにおける用語の統一を図るための変更であり、機能的な変更はありません。

  • src/pkg/math/sinh.go (Sinh関数とCosh関数): Sinh関数とCosh関数のドキュメンテーションコメントに、それぞれ以下の「Special cases」に関する記述が追加されています。

    • Sinh: Sinh(±0) = ±0, Sinh(±Inf) = ±Inf, Sinh(NaN) = NaN
    • Cosh: Cosh(±0) = 1, Cosh(±Inf) = +Inf, Cosh(NaN) = NaN これらのコメントは、関数が特定の特殊な浮動小数点入力(符号付きゼロ、無限大、非数)に対してどのような結果を返すかを明示しています。これにより、開発者はこれらのエッジケースを考慮したコードをより正確に記述できるようになります。
  • src/pkg/math/tanh.go (Tanh関数): Tanh関数のドキュメンテーションコメントに、以下の「Special cases」に関する記述が追加されています。

    • Tanh(±0) = ±0, Tanh(±Inf) = ±1, Tanh(NaN) = NaN これもSinh関数と同様に、特殊な浮動小数点入力に対する関数の挙動を明確にするための追加です。特にTanh(±Inf) = ±1は、双曲線正接関数の漸近的な振る舞いを正確に示しています。

これらの変更はすべてドキュメンテーションに関するものであり、関数の実際の計算ロジックには影響を与えません。しかし、APIの利用者が関数の振る舞いを正確に理解し、堅牢なアプリケーションを構築するために非常に重要な改善です。

関連リンク

参考にした情報源リンク