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

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

このコミットは、Go言語のテストスイートにおけるバグ修正の一環として、既存のテストファイル test/bugs/bug120.gotest/fixedbugs/bug120.go へと移動し、それに伴いテストの期待出力が記述されている test/golden.out から関連するエラーメッセージの記述を削除するものです。

コミット

  • コミットハッシュ: 77fbc310e4d9a44dc0c98561709793a2a0a59a15
  • 作者: Rob Pike r@golang.org
  • コミット日時: 2008年12月10日 14:59:43 -0800
  • 変更ファイル:
    • test/{bugs => fixedbugs}/bug120.go (ファイル名変更)
    • test/golden.out (変更)

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

https://github.com/golang/go/commit/77fbc310e4d9a44dc0c98561709793a2a0a59a15

元コミット内容

    another bug cleanup.
    
    R=rsc
    DELTA=117  (54 added, 62 deleted, 1 changed)
    OCL=20924
    CL=20927

変更の背景

このコミットは、Go言語の初期開発段階におけるバグ修正とテストスイートの整理の一環として行われました。コミットメッセージの「another bug cleanup.」が示す通り、これは複数のバグ修正作業の一部です。特に bug120.go というファイルが test/bugs ディレクトリから test/fixedbugs ディレクトリへ移動されていることから、このファイルが元々示していたバグが修正され、その修正が検証されたことを意味します。

ウェブ検索の結果から、bug120.gofloat64 定数の精度に関する問題を示していた可能性が高いことが示唆されています。Go言語の初期バージョンでは、浮動小数点数の扱い、特に型なし定数と float64 型の間の暗黙的な変換において、予期せぬ精度問題が発生することがありました。このコミットは、そのような問題が解決されたことをテストスイートに反映させるためのものです。

前提知識の解説

浮動小数点数 (Floating-Point Numbers) と IEEE 754

コンピュータにおける浮動小数点数は、実数を近似的に表現するための形式です。Go言語の float32float64 は、それぞれ単精度と倍精度の浮動小数点数であり、IEEE 754標準に準拠しています。この標準は、浮動小数点数の表現方法(符号、指数部、仮数部)と演算規則を定めています。

IEEE 754の特性上、多くの十進数(例: 0.1)は二進数で正確に表現できません。これにより、浮動小数点演算では「誤差」が生じることが避けられません。これはGo言語に限らず、多くのプログラミング言語に共通する特性です。

Go言語の型なし定数 (Untyped Constants)

Go言語には「型なし定数」という概念があります。これは、リテラル(例: 22, 7, 3.14)や定数式が、特定の型に束縛されずに任意精度で扱われることを意味します。これらの定数は、変数に代入される際や、型付きのオペランドと演算される際に、文脈に応じて適切な型に「暗黙的に変換」されます。

例えば、const pi = 3.141592653589793 のような定数は、float64 型の変数に代入されるまで、その精度を保ちます。しかし、この暗黙的な変換の挙動が、特に浮動小数点数の場合、開発者の期待と異なる結果を生むことがありました。例えば、22 / 7 のような式では、両方のオペランドが整数であるため整数除算が行われ、結果は 3 となります。浮動小数点除算を行うには、少なくとも一方のオペランドを浮動小数点数として明示する必要があります(例: 22.0 / 7.0)。

Go言語のテストスイートと test/golden.out

Go言語の標準ライブラリやコンパイラのテストは、広範なテストスイートによって行われます。test/bugs ディレクトリは、発見されたバグを再現するためのテストケースを格納する場所として使われていました。バグが修正されると、そのテストケースは test/fixedbugs ディレクトリに移動され、修正が正しく適用されたことを示すものとなります。

test/golden.out ファイルは、Go言語のテストフレームワークにおいて、特定のテストケースの「期待される出力」を記録するために使用されることがあります。テスト実行時に生成される出力が golden.out に記述された内容と一致するかどうかを比較することで、テストの合否を判定します。したがって、バグが修正され、そのテストケースがもはやエラーを出力しなくなった場合、golden.out からそのエラーメッセージの記述を削除する必要があります。

技術的詳細

このコミットの技術的詳細は、Go言語のコンパイラまたはランタイムにおける float64 定数の処理に関するバグが修正されたことを示唆しています。bug120.go が元々どのようなコードを含んでいたかはコミット情報からは直接読み取れませんが、test/golden.out から削除された行 Bad float64 const: 1e23+1 want 1.0000000000000001e+23 got 1e+23 から、1e23+1 のような非常に大きな浮動小数点定数の解釈に問題があったことが推測されます。

具体的には、1e23+1 という定数が、期待される 1.0000000000000001e+23 ではなく、1e+23 として誤って解釈されていたことを示しています。これは、Goコンパイラが定数を処理する際の精度計算、または内部表現に問題があったことを意味します。want exact: 100000000000000008388608got exact: 99999999999999991611392 という行は、この浮動小数点数の正確な整数表現(おそらく内部的な固定小数点表現や、より高精度な計算結果)における期待値と実際の値の不一致を示しており、問題が数値の丸めや切り捨てに関連していた可能性が高いです。

このバグが修正されたことにより、bug120.go はもはやこの「Bad float64 const」エラーを出力しなくなり、テストが成功するようになったため、test/golden.out から該当するエラーメッセージの行が削除されました。

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

このコミットにおけるコアとなるコードの変更は以下の2点です。

  1. ファイルのリネーム: test/bugs/bug120.gotest/fixedbugs/bug120.go にリネームされました。

    --- a/test/bugs/bug120.go
    +++ b/test/fixedbugs/bug120.go
    similarity index 100%
    rename from test/bugs/bug120.go
    rename to test/fixedbugs/bug120.go
    
  2. test/golden.out の変更: test/golden.out から bug120.go に関連する以下の8行が削除されました。

    --- a/test/golden.out
    +++ b/test/golden.out
    @@ -152,12 +152,6 @@ BUG: should compile
     panic PC=xxx
     BUG: should not fail
     
    -=========== bugs/bug120.go
    -Bad float64 const: 1e23+1 want 1.0000000000000001e+23 got 1e+23
    -	want exact: 100000000000000008388608
    -	got exact:  99999999999999991611392
    -BUG: bug120
    -
     =========== bugs/bug121.go
     BUG: compilation succeeds incorrectly
     
    @@ -291,5 +285,3 @@ SIGSEGV: segmentation violation
     Faulting address: 0x0
     pc: xxx
     
    -
    -=========== fixedbugs/bug126.go
    

コアとなるコードの解説

ファイルのリネームの意義

test/bugs/bug120.go から test/fixedbugs/bug120.go へのファイルのリネームは、Go言語のテスト管理における重要な慣習を反映しています。

  • test/bugs ディレクトリは、現在アクティブなバグを再現し、その修正を検証するためのテストケースを格納します。これらのテストは、バグが修正されるまでは失敗することが期待されます。
  • test/fixedbugs ディレクトリは、既に修正されたバグの回帰テスト(regression test)を格納します。これらのテストは、常に成功することが期待され、将来的に同じバグが再発しないことを保証します。

したがって、bug120.gofixedbugs に移動されたということは、bug120.go が示していた float64 定数に関するバグが、このコミット以前の変更によって既に修正されており、このコミットはその修正が正しく機能していることをテストスイートの構造に反映させるための「クリーンアップ」作業であることを意味します。

test/golden.out の変更の意義

test/golden.out は、Go言語のテスト実行結果の「ゴールデンファイル」として機能します。テストが実行されると、その出力がこのファイルに記述された期待される出力と比較されます。

test/golden.out から bug120.go に関連するエラーメッセージ(Bad float64 const: ...)が削除されたことは、以下のことを意味します。

  1. バグの修正: bug120.go がテストしていた float64 定数の精度に関するバグが修正されたため、もはやそのテストは「Bad float64 const」というエラーを出力しなくなりました。
  2. テストの成功: バグ修正後、bug120.go は期待通りに動作し、エラーなしでコンパイル・実行されるようになりました。そのため、golden.out にエラーメッセージを記述しておく必要がなくなりました。
  3. テストスイートの整合性: golden.out を更新することで、テストスイート全体の整合性が保たれ、将来のテスト実行時に誤ったエラーが報告されることを防ぎます。

この変更は、単なるファイルの移動だけでなく、Go言語のコンパイラまたはランタイムにおける浮動小数点数処理の正確性が向上したことを示す重要な証拠となります。

関連リンク

参考にした情報源リンク