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

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

このコミットは、Go言語の標準ライブラリである src/pkg/math/hypot.go ファイルに対する変更です。このファイルは、math パッケージの一部として、Hypot 関数(直角三角形の斜辺の長さを計算する関数)の実装とドキュメンテーションを含んでいます。

コミット

math: Hypot の特殊ケースを他の関数と合わせる

この変更は、Hypot の説明を、このパッケージ内の他のルーチンで使用されている形式に合わせるものです。

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

https://github.com/golang/go/commit/60a1f54d6b45e71022af91c84eb39916928e46e1

元コミット内容

math: make Hypot special cases look like others

The edit makes Hypot's description match the form
used in the other routines in this package.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/8003046

変更の背景

このコミットの主な目的は、Go言語の math パッケージにおける Hypot 関数のドキュメンテーションを、パッケージ内の他の数学関数のドキュメンテーションスタイルと一貫させることです。具体的には、浮動小数点数の特殊なケース(無限大 Inf や非数 NaN)の記述方法を統一し、より明確で詳細な情報を提供するように修正されています。

Go言語の標準ライブラリは、その一貫性と読みやすさで知られています。特に、数学関数のような基本的な機能においては、ユーザーが期待する動作や特殊な入力に対する振る舞いが明確に記述されていることが重要です。以前の Hypot 関数の特殊ケースの記述は、「pまたはqが無限大の場合、Hypot(p, q) = +Inf」といった一般的な表現でした。しかし、math パッケージ内の他の関数では、引数の符号(±Inf)や、どちらの引数が特殊値であるかをより具体的に示す形式が採用されていました。このコミットは、このような記述の不統一を解消し、ライブラリ全体のドキュメンテーション品質を向上させることを意図しています。

前提知識の解説

1. math.Hypot 関数

math.Hypot(p, q float64) float64 は、Go言語の math パッケージに属する関数で、2つの浮動小数点数 pq を引数に取り、sqrt(p*p + q*q)、すなわち直角三角形の斜辺の長さを返します。この関数は、pq が非常に大きい場合でも、中間結果の p*pq*q がオーバーフローしたり、非常に小さい場合にアンダーフローしたりするのを避けるように設計されています。これは、数値計算の安定性を保つ上で非常に重要です。

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

Go言語の float64 型は、IEEE 754 倍精度浮動小数点数標準に準拠しています。この標準では、通常の数値に加えて、以下のような特殊な値を定義しています。

  • 無限大 (Infinity, Inf): 正の無限大 (+Inf) と負の無限大 (-Inf) があります。例えば、0で非ゼロの数を割った結果など、計算結果が表現可能な最大値を超える場合に発生します。
  • 非数 (Not a Number, NaN): 不定形な結果(例: 0/0、Inf - Inf、Inf * 0、sqrt(-1))を表すために使用されます。NaNは、どのような値と比較しても(自分自身と比較しても)等しくないという特殊な性質を持ちます。

これらの特殊な値が数学関数の入力として与えられた場合、その関数の出力もまた、IEEE 754 標準や特定の言語・ライブラリの仕様に基づいて定義された特殊な値になることがあります。ドキュメンテーションでは、これらの特殊ケースの振る舞いを明確に記述することが求められます。

3. Go言語のドキュメンテーション規約

Go言語では、エクスポートされた関数、変数、型などには、その直前にコメントを記述することでドキュメンテーションを生成する仕組みがあります。このコメントは、godoc ツールによって解析され、HTML形式のドキュメントとして公開されます。そのため、コメントの記述スタイルや内容の一貫性は、Go言語のコードベース全体で非常に重視されます。特に、関数の特殊な振る舞い(エラー条件、特殊な入力に対する出力など)は、ユーザーが関数を正しく利用するために不可欠な情報として、明確かつ簡潔に記述されるべきです。

技術的詳細

このコミットの技術的な詳細は、math.Hypot 関数のドキュメンテーションコメントの変更に集約されます。変更前と変更後の「Special cases are:」以下の記述を比較することで、その意図が明確になります。

変更前:

// Special cases are:
//	Hypot(p, q) = +Inf if p or q is infinite
//	Hypot(p, q) = NaN if p or q is NaN

変更後:

// Special cases are:
//	Hypot(±Inf, q) = +Inf
//	Hypot(p, ±Inf) = +Inf
//	Hypot(NaN, q) = NaN
//	Hypot(p, NaN) = NaN

この変更は、以下の点で技術的な改善をもたらしています。

  1. 引数の特定: 変更前は「p or q is infinite」と抽象的でしたが、変更後は Hypot(±Inf, q)Hypot(p, ±Inf) のように、どちらの引数が無限大であるかを明示しています。これにより、ユーザーは関数の振る舞いをより具体的に理解できます。
  2. 符号の明示: 無限大の記述に ±Inf を使用することで、正の無限大と負の無限大のどちらが入力されても結果が +Inf になることを明確に示しています。Hypot 関数は sqrt(p*p + q*q) を計算するため、pq が負の無限大であっても、二乗されることで結果的に正の大きな値となり、最終的な斜辺の長さは +Inf となるのが正しい振る舞いです。この ±Inf の表記は、他の math パッケージの関数でも一般的に使用されているスタイルであり、一貫性が保たれます。
  3. NaNの対称性: NaNのケースについても、Hypot(NaN, q) = NaNHypot(p, NaN) = NaN のように、どちらの引数がNaNであっても結果がNaNになることを個別に記述しています。これは、NaNの伝播(いずれかの入力がNaNであれば出力もNaNになる)という浮動小数点数の一般的な規則を、より詳細に表現したものです。

これらの変更は、関数の実際の動作を変更するものではなく、そのドキュメンテーションの正確性、詳細性、およびパッケージ全体の一貫性を向上させるものです。これにより、開発者が math.Hypot 関数をより自信を持って、そして誤解なく使用できるようになります。

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

変更は src/pkg/math/hypot.go ファイルのドキュメンテーションコメント部分に限定されています。

--- a/src/pkg/math/hypot.go
+++ b/src/pkg/math/hypot.go
@@ -12,8 +12,10 @@ package math
 // unnecessary overflow and underflow.
 //
 // Special cases are:
-//	Hypot(p, q) = +Inf if p or q is infinite
-//	Hypot(p, q) = NaN if p or q is NaN
+//	Hypot(±Inf, q) = +Inf
+//	Hypot(p, ±Inf) = +Inf
+//	Hypot(NaN, q) = NaN
+//	Hypot(p, NaN) = NaN
 func Hypot(p, q float64) float64

コアとなるコードの解説

このコミットにおけるコアとなるコードの変更は、Hypot 関数の定義直前にあるコメントブロック内の「Special cases are:」セクションです。

  • 削除された行:

    • // Hypot(p, q) = +Inf if p or q is infinite
    • // Hypot(p, q) = NaN if p or q is NaN これらの行は、無限大とNaNの特殊ケースを一般的な形で記述していました。
  • 追加された行:

    • // Hypot(±Inf, q) = +Inf
    • // Hypot(p, ±Inf) = +Inf
    • // Hypot(NaN, q) = NaN
    • // Hypot(p, NaN) = NaN これらの行は、無限大とNaNの特殊ケースをより詳細かつ具体的に記述しています。 Hypot(±Inf, q) = +Inf は、p が正または負の無限大である場合に、q の値にかかわらず結果が正の無限大になることを示します。 Hypot(p, ±Inf) = +Inf は、同様に q が正または負の無限大である場合に、p の値にかかわらず結果が正の無限大になることを示します。 Hypot(NaN, q) = NaN は、p がNaNである場合に、q の値にかかわらず結果がNaNになることを示します。 Hypot(p, NaN) = NaN は、同様に q がNaNである場合に、p の値にかかわらず結果がNaNになることを示します。

この変更は、Go言語の math パッケージにおけるドキュメンテーションの一貫性を高めるためのものであり、関数の振る舞い自体には影響を与えません。しかし、開発者が Hypot 関数の特殊な入力に対する挙動を正確に理解する上で、非常に価値のある改善です。

関連リンク

  • Go Change List 8003046: https://golang.org/cl/8003046 これは、このコミットに対応するGoのコードレビューシステム(Gerrit)上の変更リストです。コミットメッセージに記載されているリンクであり、変更の議論や承認プロセスを確認できます。

参考にした情報源リンク