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

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

このコミットは、Go言語の標準ライブラリ math/big パッケージ内の Rat 型の Float64 メソッドに関するドキュメンテーションを改善するものです。具体的には、Rat.Float64 が返す float64 値が、元の Rat (有理数) の大きさが float64 で表現するには大きすぎる場合に無限大となること、そしてその際に exact フラグが false となることを明記することで、ドキュメンテーションの明確性を向上させています。

コミット

commit 5bd61e060382a51bd2c538552775aa375e7f63a0
Author: Robert Griesemer <gri@golang.org>
Date:   Mon Jul 29 13:06:34 2013 -0700

    math/big: better documentation for Rat.Float64
    
    R=adonovan, r
    CC=golang-dev
    https://golang.org/cl/11961043

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

https://github.com/golang/go/commit/5bd61e060382a51bd2c538552775aa375e7f63a0

元コミット内容

math/big: better documentation for Rat.Float64

変更の背景

math/big パッケージの Rat.Float64 メソッドは、有理数を最も近い float64 値に変換し、その変換が正確であったかどうかを示すブール値を返します。しかし、元のドキュメンテーションでは、有理数の絶対値が float64 で表現できる範囲を超えた場合の挙動について明確な記述がありませんでした。

float64 は有限の範囲しか表現できないため、非常に大きな(または非常に小さな)数を表現しようとすると、オーバーフローして無限大(またはゼロ)になります。このコミットは、このようなエッジケースにおいて Rat.Float64 がどのように振る舞うか、特に無限大が返される場合に exact フラグが false になることを明示するために行われました。これにより、ユーザーがこのメソッドの挙動をより正確に理解し、予期せぬ結果を避けることができるようになります。

前提知識の解説

math/big パッケージ

math/big パッケージは、Go言語で任意精度(arbitrary-precision)の算術演算を可能にするための型を提供します。これは、標準の組み込み型(int, float64 など)が持つ固定のビット幅による精度や範囲の制限を克服するために使用されます。

  • Int: 任意精度の整数型。
  • Float: 任意精度の浮動小数点数型。
  • Rat: 任意精度の有理数型。分子と分母を任意精度の整数で保持します。これにより、循環小数や無限に続く小数を正確に表現できます。

Rat

Rat 型は、p/q の形式で有理数を表現します。ここで p は分子、q は分母であり、どちらも任意精度の整数です。Rat 型は、正確な分数計算が必要な場合に非常に有用です。

Float64 メソッド

Rat 型の Float64 メソッドは、その有理数をGoの組み込み型である float64 に変換します。float64 はIEEE 754倍精度浮動小数点数であり、約15〜17桁の10進精度と、約 10^308 までの範囲を持ちます。

func (x *Rat) Float64() (f float64, exact bool)

このメソッドは2つの値を返します。

  • f float64: x に最も近い float64 値。
  • exact bool: fx を正確に表現している場合に true、そうでない場合に false

浮動小数点数 (float64) の表現と限界

float64 は、符号、指数部、仮数部から構成されるバイナリ表現を使用します。これにより、非常に広い範囲の数を表現できますが、その精度は有限であり、また表現できる値の範囲にも限界があります。

  • 正確な表現: 全ての有理数が float64 で正確に表現できるわけではありません。例えば、1/3 は float64 では正確に表現できず、近似値となります。この場合、exactfalse になります。
  • 無限大 (Infinity): float64 の表現可能な最大値を超える数を計算しようとすると、正または負の無限大 (+Inf または -Inf) となります。これはオーバーフローの一種です。
  • 非数 (NaN - Not a Number): 不定形な演算(例: 0/0)の結果として生成される特殊な値です。

このコミットの文脈では、Rat の値が float64 の最大値を超えた場合に、Float64 メソッドが無限大を返すという挙動が重要になります。

技術的詳細

このコミットの技術的なポイントは、Rat.Float64 メソッドのドキュメンテーションが、float64 の表現能力の限界、特にオーバーフローによる無限大の生成について明示的に言及するように変更された点です。

以前のドキュメンテーションでは、Float64 が「x の最も近い float64 値と、fx を正確に表現しているかどうかを示すブール値を返す」とだけ述べられていました。これは、xfloat64 の表現範囲内にある場合には十分ですが、x の絶対値が float64 の最大値(約 1.7976931348623157 × 10^308)を超えた場合、float64 は無限大を返します。

この変更により、ドキュメンテーションは以下の重要な情報を追加しました。

If the magnitude of x is too large to be represented by a float64, f is an infinity and exact is false.

これは、以下の点を明確にしています。

  1. 大きすぎる値の扱い: Rat の絶対値が float64 で表現するには大きすぎる場合、結果の f は無限大 (+Inf または -Inf) になります。
  2. exact フラグの挙動: このような無限大が返される場合、元の有理数を正確に表現できていないため、exact フラグは必ず false になります。

この変更は、APIの挙動に関する曖昧さを排除し、ユーザーが Rat.Float64 を使用する際に、特に非常に大きな数値を扱う場合に、どのような結果が期待されるかを正確に理解できるようにするために重要です。これにより、予期せぬバグや誤解を防ぎ、より堅牢なコードを書く手助けとなります。

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

--- a/src/pkg/math/big/rat.go
+++ b/src/pkg/math/big/rat.go
@@ -164,8 +164,9 @@ func quotToFloat(a, b nat) (f float64, exact bool) {
 }
 
 // Float64 returns the nearest float64 value for x and a bool indicating
-// whether f represents x exactly. The sign of f always matches the sign
-// of x, even if f == 0.
+// whether f represents x exactly. If the magnitude of x is too large to
+// be represented by a float64, f is an infinity and exact is false.
+// The sign of f always matches the sign of x, even if f == 0.
 func (x *Rat) Float64() (f float64, exact bool) {
 	b := x.b.abs
 	if len(b) == 0 {

コアとなるコードの解説

変更は src/pkg/math/big/rat.go ファイルの Float64 メソッドのコメント部分にあります。

元のコメント:

// Float64 returns the nearest float64 value for x and a bool indicating
// whether f represents x exactly. The sign of f always matches the sign
// of x, even if f == 0.

変更後のコメント:

// Float64 returns the nearest float64 value for x and a bool indicating
// whether f represents x exactly. If the magnitude of x is too large to
// be represented by a float64, f is an infinity and exact is false.
// The sign of f always matches the sign of x, even if f == 0.

追加された行は以下の通りです。 If the magnitude of x is too large to be represented by a float64, f is an infinity and exact is false.

この追加により、Float64 メソッドの挙動に関する重要なエッジケースが明示されました。具体的には、入力された有理数 x の絶対値が float64 型で表現できる最大値を超えた場合、返される float64f は無限大(+Inf または -Inf)となり、同時に exact フラグは false に設定されることが明確に示されています。

これは、math/big パッケージが任意精度を扱う一方で、float64 への変換は固定精度と範囲を持つ型への変換であるため、情報の損失が発生しうることをユーザーに警告するものです。特に、無限大が返されるケースでは、元の有理数が正確に表現されていないため、exactfalse になるのは当然の挙動ですが、それを明示することで、APIの利用者が誤解なくコードを記述できるようになります。

関連リンク

参考にした情報源リンク