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

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

このコミットは、Go言語の仕様書(doc/go_spec.html)に、浮動小数点定数の型変換における丸め規則に関する記述を追加するものです。具体的には、浮動小数点定数を浮動小数点型に変換する際に、IEEE 754の最近接偶数への丸め(round-to-even)規則が適用されることを明記しています。

コミット

commit 7576179aa3de1afc372da5ac9e9d4bcbdf226560
Author: Russ Cox <rsc@golang.org>
Date:   Mon Feb 11 07:47:41 2013 -0500

    spec: document fp rounding during explicit constant conversion
    
    The gc compilers already behave this way. It was an explicit
    decision during the very long constant design discussions,
    but it appears not to have made it into the spec.
    
    Fixes #4398.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/7313069

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

https://github.com/golang/go/commit/7576179aa3de1afc372da5ac9e9d4bcbdf226560

元コミット内容

このコミットは、Go言語の仕様書(doc/go_spec.html)の型変換に関するセクションに、以下の記述を追加しています。

<li>
    <code>x</code> is a floating-point constant,
    <code>T</code> is a floating-point type,
    and <code>x</code> is representable by a value
    of type <code>T</code> after rounding using
    IEEE 754 round-to-even rules.
    The constant <code>T(x)</code> is the rounded value.
</li>

また、例として以下の行が追加されています。

float32(0.49999999)      // 0.5 of type float32

変更の背景

コミットメッセージによると、この変更はGo言語のコンパイラ(gc)が既にこの丸め規則に従って動作しているにもかかわらず、その挙動が仕様書に明記されていなかったためです。これは、Go言語の定数設計に関する長期間にわたる議論の中で明示的に決定された事項でしたが、仕様書への反映が漏れていたようです。

この変更は、Issue #4398 を修正するものです。Issue #4398は、Go言語の浮動小数点定数変換における丸め挙動が仕様書に明記されていないことによる混乱や誤解を解消するために提起されたと考えられます。仕様書に明記することで、Go言語の挙動の一貫性と予測可能性を高め、開発者がより正確なコードを書けるようにすることが目的です。

前提知識の解説

浮動小数点数

浮動小数点数とは、実数を近似的に表現するためのコンピュータの数値表現形式です。通常、符号部、指数部、仮数部から構成され、非常に広い範囲の数値を表現できますが、精度には限界があります。Go言語では、float32(単精度浮動小数点数)とfloat64(倍精度浮動小数点数)が標準で提供されています。

IEEE 754

IEEE 754は、浮動小数点演算に関する国際標準規格です。この規格は、浮動小数点数の表現形式、基本的な演算(加算、減算、乗算、除算、平方根)、および例外処理(オーバーフロー、アンダーフロー、ゼロ除算など)について定めています。これにより、異なるハードウェアやソフトウェア環境でも浮動小数点演算の結果が一致することが保証され、数値計算の移植性と信頼性が向上します。

丸め規則 (Rounding Rules)

浮動小数点演算では、計算結果が正確に表現できない場合があるため、近似値を表現するために丸め処理が必要になります。IEEE 754では、いくつかの標準的な丸め規則が定義されています。

  • 最近接偶数への丸め (Round to Nearest, Ties to Even): これはIEEE 754のデフォルトの丸め規則であり、最も一般的に使用されます。

    • もし正確な値が2つの表現可能な数値の中間にある場合(例えば、0.5のようにちょうど真ん中にある場合)、末尾の桁が偶数になる方に丸められます。
    • 例:
      • 2.5 は 2 に丸められる(末尾の桁が偶数)
      • 3.5 は 4 に丸められる(末尾の桁が偶数)
      • 2.2 は 2 に丸められる
      • 2.7 は 3 に丸められる
    • この規則は、統計的なバイアスを最小限に抑える効果があります。
  • ゼロへの丸め (Round toward Zero): 数値をゼロに近づく方向に丸めます(切り捨て)。

  • 正の無限大への丸め (Round toward +∞): 数値を正の無限大に近づく方向に丸めます(切り上げ)。

  • 負の無限大への丸め (Round toward -∞): 数値を負の無限大に近づく方向に丸めます(切り下げ)。

Go言語の定数

Go言語の定数は、コンパイル時に値が決定される不変のエンティティです。Goの定数は、型付けされていない定数(untyped constants)と型付けされた定数(typed constants)に分けられます。型付けされていない定数は、必要に応じて異なる型に変換される柔軟性を持っています。このコミットで扱われているのは、このような型付けされていない浮動小数点定数が、明示的に浮動小数点型に変換される際の挙動です。

技術的詳細

このコミットの技術的な核心は、Go言語のコンパイラが内部的にどのように浮動小数点定数を処理し、それが最終的にGo言語の仕様としてどのように文書化されるべきかという点にあります。

Go言語のコンパイラ(特にgc)は、浮動小数点定数を扱う際に、高い精度で内部的に保持しています。しかし、これらの定数が特定の浮動小数点型(float32float64)に明示的に変換される際には、その型の精度に合わせて丸め処理が行われる必要があります。この丸め処理の具体的なアルゴリズムとして、IEEE 754で定められている「最近接偶数への丸め(round-to-even)」が採用されています。

この規則が適用されるのは、以下の条件がすべて満たされる場合です。

  1. x が浮動小数点定数であること。
  2. T が浮動小数点型(float32またはfloat64)であること。
  3. x が、IEEE 754の最近接偶数への丸め規則を適用した後に、型 T の値として表現可能であること。

この条件が満たされた場合、定数 T(x) の値は、丸められた結果の値となります。

例として追加された float32(0.49999999) は、この規則の具体的な適用例を示しています。 0.49999999 は浮動小数点定数であり、float32 は浮動小数点型です。 float32 の精度では 0.49999999 を正確に表現することはできません。 0.499999990.5 に非常に近い値です。 IEEE 754の最近接偶数への丸め規則に従うと、0.499999990.5 に丸められます。 したがって、float32(0.49999999) の結果は 0.5(型は float32)となります。

この仕様の追加により、Go言語の浮動小数点定数変換の挙動が明確になり、開発者はこの挙動を前提としたコードを安心して書けるようになります。特に、数値計算の正確性が求められるアプリケーションにおいて、この明確化は重要です。

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

変更は doc/go_spec.html ファイルのみです。

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -3470,6 +3470,14 @@ type <code>T</code> in any of these cases:
 	<code>x</code> is representable by a value of type <code>T</code>.
 	</li>
 	<li>
+	<code>x</code> is a floating-point constant,
+	<code>T</code> is a floating-point type,
+	and <code>x</code> is representable by a value
+	of type <code>T</code> after rounding using
+	IEEE 754 round-to-even rules.
+	The constant <code>T(x)</code> is the rounded value.
+	</li>
+	<li>
 	<code>x</code> is an integer constant and <code>T</code> is a
 	<a href=\"#String_types\">string type</a>.
 	The same rule as for non-constant <code>x</code> applies in this case
@@ -3485,6 +3493,7 @@ Converting a constant yields a typed constant as result.
 uint(iota)               // iota value of type uint
 float32(2.718281828)     // 2.718281828 of type float32
 complex128(1)            // 1.0 + 0.0i of type complex128
+float32(0.49999999)      // 0.5 of type float32
 string('x')              // "x" of type string
 string(0x266c)           // "♬" of type string
 MyString("foo" + "bar")  // "foobar" of type MyString

コアとなるコードの解説

追加されたHTMLスニペットは、Go言語の仕様書における「Conversions」(型変換)のセクションに挿入されています。このセクションは、Go言語における様々な型変換の規則を定義しています。

新しい <li> 要素は、浮動小数点定数から浮動小数点型への変換に関する特定の規則を記述しています。

  • <code>x</code> is a floating-point constant,: 変換元の値 x が浮動小数点定数であることを示します。
  • <code>T</code> is a floating-point type,: 変換先の型 T が浮動小数点型(float32 または float64)であることを示します。
  • and <code>x</code> is representable by a value of type <code>T</code> after rounding using IEEE 754 round-to-even rules.: ここが最も重要な部分で、x が型 T で表現可能であるためには、IEEE 754の最近接偶数への丸め規則が適用された後でなければならないことを明記しています。
  • The constant <code>T(x)</code> is the rounded value.: 変換結果の定数 T(x) は、この丸め処理によって得られた値であることを示しています。

また、既存の例のリストに float32(0.49999999) // 0.5 of type float32 が追加され、この新しい規則の具体的な適用例として示されています。これは、0.49999999float32 型に変換される際に、最近接偶数への丸め規則によって 0.5 に丸められることを明確に示しています。

この変更は、Go言語の仕様の正確性と完全性を高め、特に数値計算の挙動に関する曖昧さを排除することを目的としています。

関連リンク

参考にした情報源リンク

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

このコミットは、Go言語の仕様書(doc/go_spec.html)に、浮動小数点定数の型変換における丸め規則に関する記述を追加するものです。具体的には、浮動小数点定数を浮動小数点型に変換する際に、IEEE 754の最近接偶数への丸め(round-to-even)規則が適用されることを明記しています。

コミット

commit 7576179aa3de1afc372da5ac9e9d4bcbdf226560
Author: Russ Cox <rsc@golang.org>
Date:   Mon Feb 11 07:47:41 2013 -0500

    spec: document fp rounding during explicit constant conversion
    
    The gc compilers already behave this way. It was an explicit
    decision during the very long constant design discussions,
    but it appears not to have made it into the spec.
    
    Fixes #4398.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/7313069

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

https://github.com/golang/go/commit/7576179aa3de1afc372da5ac9e9d4bcbdf226560

元コミット内容

このコミットは、Go言語の仕様書(doc/go_spec.html)の型変換に関するセクションに、以下の記述を追加しています。

<li>
    <code>x</code> is a floating-point constant,
    <code>T</code> is a floating-point type,
    and <code>x</code> is representable by a value
    of type <code>T</code> after rounding using
    IEEE 754 round-to-even rules.
    The constant <code>T(x)</code> is the rounded value.
</li>

また、例として以下の行が追加されています。

float32(0.49999999)      // 0.5 of type float32

変更の背景

コミットメッセージによると、この変更はGo言語のコンパイラ(gc)が既にこの丸め規則に従って動作しているにもかかわらず、その挙動が仕様書に明記されていなかったためです。これは、Go言語の定数設計に関する長期間にわたる議論の中で明示的に決定された事項でしたが、仕様書への反映が漏れていたようです。

この変更は、Issue #4398 を修正するものです。Issue #4398は、Go言語の浮動小数点定数変換における丸め挙動が仕様書に明記されていないことによる混乱や誤解を解消するために提起されたと考えられます。仕様書に明記することで、Go言語の挙動の一貫性と予測可能性を高め、開発者がより正確なコードを書けるようにすることが目的です。

前提知識の解説

浮動小数点数

浮動小数点数とは、実数を近似的に表現するためのコンピュータの数値表現形式です。通常、符号部、指数部、仮数部から構成され、非常に広い範囲の数値を表現できますが、精度には限界があります。Go言語では、float32(単精度浮動小数点数)とfloat64(倍精度浮動小数点数)が標準で提供されています。

IEEE 754

IEEE 754は、浮動小数点演算に関する国際標準規格です。この規格は、浮動小数点数の表現形式、基本的な演算(加算、減算、乗算、除算、平方根)、および例外処理(オーバーフロー、アンダーフロー、ゼロ除算など)について定めています。これにより、異なるハードウェアやソフトウェア環境でも浮動小数点演算の結果が一致することが保証され、数値計算の移植性と信頼性が向上します。

丸め規則 (Rounding Rules)

浮動小数点演算では、計算結果が正確に表現できない場合があるため、近似値を表現するために丸め処理が必要になります。IEEE 754では、いくつかの標準的な丸め規則が定義されています。

  • 最近接偶数への丸め (Round to Nearest, Ties to Even): これはIEEE 754のデフォルトの丸め規則であり、最も一般的に使用されます。

    • もし正確な値が2つの表現可能な数値の中間にある場合(例えば、0.5のようにちょうど真ん中にある場合)、末尾の桁が偶数になる方に丸められます。
    • 例:
      • 2.5 は 2 に丸められる(末尾の桁が偶数)
      • 3.5 は 4 に丸められる(末尾の桁が偶数)
      • 2.2 は 2 に丸められる
      • 2.7 は 3 に丸められる
    • この規則は、統計的なバイアスを最小限に抑える効果があります。
  • ゼロへの丸め (Round toward Zero): 数値をゼロに近づく方向に丸めます(切り捨て)。

  • 正の無限大への丸め (Round toward +∞): 数値を正の無限大に近づく方向に丸めます(切り上げ)。

  • 負の無限大への丸め (Round toward -∞): 数値を負の無限大に近づく方向に丸めます(切り下げ)。

Go言語の定数

Go言語の定数は、コンパイル時に値が決定される不変のエンティティです。Goの定数は、型付けされていない定数(untyped constants)と型付けされた定数(typed constants)に分けられます。型付けされていない定数は、必要に応じて異なる型に変換される柔軟性を持っています。このコミットで扱われているのは、このような型付けされていない浮動小数点定数が、明示的に浮動小数点型に変換される際の挙動です。

技術的詳細

このコミットの技術的な核心は、Go言語のコンパイラが内部的にどのように浮動小数点定数を処理し、それが最終的にGo言語の仕様としてどのように文書化されるべきかという点にあります。

Go言語のコンパイラ(特にgc)は、浮動小数点定数を扱う際に、高い精度で内部的に保持しています。しかし、これらの定数が特定の浮動小数点型(float32float64)に明示的に変換される際には、その型の精度に合わせて丸め処理が行われる必要があります。この丸め処理の具体的なアルゴリズムとして、IEEE 754で定められている「最近接偶数への丸め(round-to-even)」が採用されています。

この規則が適用されるのは、以下の条件がすべて満たされる場合です。

  1. x が浮動小数点定数であること。
  2. T が浮動小数点型(float32またはfloat64)であること。
  3. x が、IEEE 754の最近接偶数への丸め規則を適用した後に、型 T の値として表現可能であること。

この条件が満たされた場合、定数 T(x) の値は、丸められた結果の値となります。

例として追加された float32(0.49999999) は、この規則の具体的な適用例を示しています。 0.49999999 は浮動小数点定数であり、float32 は浮動小数点型です。 float32 の精度では 0.49999999 を正確に表現することはできません。 0.499999990.5 に非常に近い値です。 IEEE 754の最近接偶数への丸め規則に従うと、0.499999990.5 に丸められます。 したがって、float32(0.49999999) の結果は 0.5(型は float32)となります。

この仕様の追加により、Go言語の浮動小数点定数変換の挙動が明確になり、開発者はこの挙動を前提としたコードを安心して書けるようになります。特に、数値計算の正確性が求められるアプリケーションにおいて、この明確化は重要です。

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

変更は doc/go_spec.html ファイルのみです。

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -3470,6 +3470,14 @@ type <code>T</code> in any of these cases:
 	<code>x</code> is representable by a value of type <code>T</code>.
 	</li>
 	<li>
+	<code>x</code> is a floating-point constant,
+	<code>T</code> is a floating-point type,
+	and <code>x</code> is representable by a value
+	of type <code>T</code> after rounding using
+	IEEE 754 round-to-even rules.
+	The constant <code>T(x)</code> is the rounded value.
+	</li>
+	<li>
 	<code>x</code> is an integer constant and <code>T</code> is a
 	<a href=\"#String_types\">string type</a>.
 	The same rule as for non-constant <code>x</code> applies in this case
@@ -3485,6 +3493,7 @@ Converting a constant yields a typed constant as result.
 uint(iota)               // iota value of type uint
 float32(2.718281828)     // 2.718281828 of type float32
 complex128(1)            // 1.0 + 0.0i of type complex128
+float32(0.49999999)      // 0.5 of type float32
 string('x')              // "x" of type string
 string(0x266c)           // "♬" of type string
 MyString("foo" + "bar")  // "foobar" of type MyString

コアとなるコードの解説

追加されたHTMLスニペットは、Go言語の仕様書における「Conversions」(型変換)のセクションに挿入されています。このセクションは、Go言語における様々な型変換の規則を定義しています。

新しい <li> 要素は、浮動小数点定数から浮動小数点型への変換に関する特定の規則を記述しています。

  • <code>x</code> is a floating-point constant,: 変換元の値 x が浮動小数点定数であることを示します。
  • <code>T</code> is a floating-point type,: 変換先の型 T が浮動小数点型(float32 または float64)であることを示します。
  • and <code>x</code> is representable by a value of type <code>T</code> after rounding using IEEE 754 round-to-even rules.: ここが最も重要な部分で、x が型 T で表現可能であるためには、IEEE 754の最近接偶数への丸め規則が適用された後でなければならないことを明記しています。
  • The constant <code>T(x)</code> is the rounded value.: 変換結果の定数 T(x) は、この丸め処理によって得られた値であることを示しています。

また、既存の例のリストに float32(0.49999999) // 0.5 of type float32 が追加され、この新しい規則の具体的な適用例として示されています。これは、0.49999999float32 型に変換される際に、最近接偶数への丸め規則によって 0.5 に丸められることを明確に示しています。

この変更は、Go言語の仕様の正確性と完全性を高め、特に数値計算の挙動に関する曖昧さを排除することを目的としています。

関連リンク

参考にした情報源リンク