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

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

このコミットは、Go言語の仕様書(doc/go_spec.html)を更新し、単項演算子である + および - が浮動小数点数だけでなく複素数型にも適用されることを明記するものです。これにより、Go言語における数値型の演算規則がより明確になります。

コミット

commit 95a00cae2eabf726634695ee1e079e28b9bde743
Author: Robert Griesemer <gri@golang.org>
Date:   Fri Aug 17 11:36:21 2012 -0700

    go_spec: unary + and - are also defined for complex types
    
    R=r, rsc, iant, ken, iant
    CC=golang-dev
    https://golang.org/cl/6450150

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

https://github.com/golang/go/commit/95a00cae2eabf726634695ee1e079e28b9bde743

元コミット内容

go_spec: unary + and - are also defined for complex types

変更の背景

Go言語の仕様書において、単項演算子 +- の適用範囲に関する記述が、浮動小数点数に限定されているかのような誤解を招く可能性がありました。実際には、Go言語は複素数型(complex64 および complex128)を組み込みでサポートしており、これらの単項演算子も複素数に対して有効です。

このコミットは、仕様書の記述を現実の言語実装と整合させることを目的としています。具体的には、複素数型に対しても単項 + (符号なし) と単項 - (符号反転) が適用可能であることを明示し、言語仕様の正確性と網羅性を向上させています。これにより、開発者がGo言語の数値演算の挙動をより正確に理解できるようになります。

前提知識の解説

単項演算子 (+, -)

プログラミング言語における単項演算子とは、一つのオペランド(被演算子)に対して作用する演算子のことです。

  • 単項 + (Unary Plus): オペランドの値をそのまま返します。数値型の場合、通常は値に変化はありませんが、明示的な型変換や、特定の文脈での数値の正の符号を示すために使用されることがあります。
  • 単項 - (Unary Minus): オペランドの符号を反転させます。例えば、x5 であれば -x-5 になります。

浮動小数点数 (Floating-Point Numbers)

コンピュータで実数を近似的に表現するための数値型です。Go言語では float32float64 があります。これらは小数点以下の値を扱うことができ、科学技術計算やグラフィックスなどで広く用いられます。

複素数 (Complex Numbers)

実数部と虚数部を持つ数のことです。数学では a + bi の形式で表され、a が実数部、b が虚数部、i は虚数単位(i^2 = -1)です。Go言語では complex64 (実数部と虚数部が float32) と complex128 (実数部と虚数部が float64) の2つの組み込み複素数型が提供されています。複素数は、電気工学、信号処理、量子力学など、多くの科学技術分野で不可欠な概念です。

IEEE 754 標準

浮動小数点数の算術に関する国際標準です。この標準は、浮動小数点数の表現形式、基本的な演算(加算、減算、乗算、除算、平方根)、例外処理(ゼロ除算、オーバーフロー、アンダーフローなど)について定めています。Go言語の浮動小数点数演算もこの標準に準拠しています。

技術的詳細

このコミットは、Go言語の仕様書である doc/go_spec.html の「Operators」セクション、特に単項演算子に関する記述を修正しています。

変更前は、単項 +- の説明が「For floating-point numbers, ...」と浮動小数点数に限定されているかのように読めました。しかし、Go言語の設計上、これらの演算子は複素数型に対しても自然に適用されます。

  • 単項 + (Unary Plus) for Complex Numbers: 複素数 z = a + bi に対して +za + bi となり、値は変化しません。
  • 単項 - (Unary Minus) for Complex Numbers: 複素数 z = a + bi に対して -z-a - bi となり、実数部と虚数部の両方の符号が反転します。

この修正により、仕様書はGo言語の実際の挙動を正確に反映し、単項 + および - が浮動小数点数と複素数の両方に適用されることを明確にしています。また、ゼロ除算に関する記述も、浮動小数点数だけでなく複素数に対しても適用されることを追記し、より包括的な説明となっています。

この変更は、Go言語のコンパイラやランタイムの挙動を変更するものではなく、あくまで言語仕様のドキュメントを正確にするためのものです。しかし、言語仕様はGo言語の「憲法」のようなものであり、その正確性は言語の安定性と開発者の信頼性にとって極めて重要です。

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

変更は doc/go_spec.html ファイルに対して行われています。

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
 <!--{
  	"Title": "The Go Programming Language Specification",
-	"Subtitle": "Version of August 9, 2012",
+	"Subtitle": "Version of August 17, 2012",
  	"Path": "/ref/spec"
 }-->
 
@@ -2999,10 +2999,10 @@ follows:
 </pre>
 
 <p>
-For floating-point numbers,
+For floating-point and complex numbers,
 <code>+x</code> is the same as <code>x</code>,
 while <code>-x</code> is the negation of <code>x</code>.
-The result of a floating-point division by zero is not specified beyond the
+The result of a floating-point or complex division by zero is not specified beyond the
 IEEE-754 standard; whether a <a href=\"#Run_time_panics\">run-time panic</a>
 occurs is implementation-specific.
 </p>

コアとなるコードの解説

このコミットによる変更は、主に以下の2点です。

  1. 仕様書のバージョン日付の更新:

    -	"Subtitle": "Version of August 9, 2012",
    +	"Subtitle": "Version of August 17, 2012",
    

    これは、仕様書が更新された日付を反映するための単純な変更です。

  2. 単項演算子とゼロ除算に関する記述の修正:

    -For floating-point numbers,
    +For floating-point and complex numbers,
     <code>+x</code> is the same as <code>x</code>,
     while <code>-x</code> is the negation of <code>x</code>.
    -The result of a floating-point division by zero is not specified beyond the
    +The result of a floating-point or complex division by zero is not specified beyond the
     IEEE-754 standard; whether a <a href=\"#Run_time_panics\">run-time panic</a>
     occurs is implementation-specific.
    
    • For floating-point numbers,For floating-point and complex numbers, に変更されました。これにより、単項 +- が浮動小数点数だけでなく複素数にも適用されることが明確に記述されました。
    • The result of a floating-point division by zero is not specified beyond theThe result of a floating-point or complex division by zero is not specified beyond the に変更されました。これは、ゼロ除算の挙動に関する記述が、浮動小数点数だけでなく複素数に対しても適用されることを示しています。複素数のゼロ除算も、IEEE 754標準の範囲内で未定義であり、ランタイムパニックが発生するかどうかは実装依存であるという点が強調されています。

これらの変更は、Go言語の仕様書が、単項演算子とゼロ除算の挙動に関して、浮動小数点数と複素数の両方を考慮に入れるように更新されたことを示しています。これにより、仕様書の正確性と網羅性が向上し、Go言語の数値型に関する理解が深まります。

関連リンク

参考にした情報源リンク