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

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

コミット

コミット情報:

  • ハッシュ: 36397814ccf9d54e896c1311b32a6a2f27d5b7f5
  • 作成者: Ian Lance Taylor iant@golang.org
  • 日付: 2011年12月19日 20:57:32 (PST)
  • メッセージ: "strconv: remove obsolete comment."

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

https://github.com/golang/go/commit/36397814ccf9d54e896c1311b32a6a2f27d5b7f5

元コミット内容

このコミットでは、src/pkg/strconv/ftoa.goファイルの1つのファイルに対して、1行の挿入と5行の削除を行いました。具体的には、FormatFloat関数のドキュメントコメントから古くなった記述を削除し、新しい関数名に対応した記述に更新しました。

変更前:

// necessary such that Atof32 will return f exactly.
//
// Ftoa32(f) is not the same as Ftoa64(float32(f)),
// because correct rounding and the number of digits
// needed to identify f depend on the precision of the representation.

変更後:

// necessary such that ParseFloat will return f exactly.

変更の背景

この変更は、Go 1.0リリースに向けたstrconvパッケージのAPI整理の一環として行われました。2011年当時、Goは1.0リリースに向けて大幅なAPI見直しを行っており、特にstrconvパッケージはよりGo言語らしくC言語的でない設計に刷新されていました。

主な背景:

  1. API統合: Atof32Ftoa32Ftoa64などの個別の関数が廃止され、ParseFloatFormatFloatという統一的な関数に置き換えられました
  2. コメントの陳腐化: 古いAPI名を参照するコメントが残存していたため、現在の関数名に合わせて更新が必要でした
  3. Go 1.0準備: 2012年3月のGo 1.0リリースに向けて、ドキュメンテーションの整合性を保つ必要がありました

前提知識の解説

strconvパッケージとは

strconvパッケージは、文字列と基本データ型(数値、ブール値)間の変換を行うGoの標準ライブラリです。特に浮動小数点数の変換において、精度を保った変換を提供します。

浮動小数点数の文字列変換の複雑さ

浮動小数点数の文字列変換は、以下の理由により技術的に複雑です:

  1. IEEE 754標準: 浮動小数点数は内部的にバイナリ表現で格納されているため、10進数への変換で精度の問題が発生します
  2. 丸め誤差: 変換時に最適な丸め方法を選択する必要があります
  3. 精度制御: 異なる精度(float32、float64)に対応する必要があります
  4. 可逆性: 文字列から浮動小数点数への変換で元の値を完全に復元できる必要があります

古いAPIの問題点

Go 1.0以前のAPIには以下の問題がありました:

  1. 関数の乱立: Atof32Atof64Ftoa32Ftoa64など、精度ごとに個別関数が存在
  2. C言語的命名: atof(ASCII to float)のような、C言語の影響を受けた命名規則
  3. 一貫性の欠如: 他のパッケージとの命名規則の不整合

技術的詳細

ParseFloatの設計思想

新しいParseFloat関数は、以下の設計思想に基づいています:

func ParseFloat(s string, bitSize int) (float64, error)

パラメータ:

  • s: 変換対象の文字列
  • bitSize: 32(float32)または64(float64)の精度指定

戻り値:

  • float64: 常にfloat64型で返却(必要に応じてfloat32にキャスト可能)
  • error: 変換エラー情報

FormatFloatの精度制御

FormatFloat関数の精度制御メカニズム:

func FormatFloat(f float64, fmt byte, prec, bitSize int) string

特別な精度値 -1:

  • precに-1を指定すると、ParseFloatで元の値を完全に復元できる最小桁数を自動選択
  • これにより、データの可逆性を保証

内部実装の技術的詳細

strconvパッケージの浮動小数点変換は、以下のアルゴリズムを使用:

  1. 仮数部の多倍長10進数保存: バイナリ仮数部を10進数の多倍長数値として保存
  2. 指数による桁シフト: 2進指数を10進桁シフトに変換
  3. 桁読み取りとフォーマット: 必要な桁数を読み取り、指定されたフォーマットで出力

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

変更箇所はsrc/pkg/strconv/ftoa.goファイルのFormatFloat関数のドキュメントコメント部分です:

 // For 'e', 'E', and 'f' it is the number of digits after the decimal point.
 // For 'g' and 'G' it is the total number of digits.
 // The special precision -1 uses the smallest number of digits
-// necessary such that Atof32 will return f exactly.
-//
-// Ftoa32(f) is not the same as Ftoa64(float32(f)),
-// because correct rounding and the number of digits
-// needed to identify f depend on the precision of the representation.
+// necessary such that ParseFloat will return f exactly.
 func FormatFloat(f float64, fmt byte, prec, bitSize int) string {
 	return string(genericFtoa(make([]byte, 0, max(prec+4, 24)), f, fmt, prec, bitSize))
 }

コアとなるコードの解説

削除されたコメントの意味

削除された部分の技術的意味:

  1. Atof32への参照: 古いAPI名への参照が残存していました
  2. Ftoa32Ftoa64の相違点: 異なる精度での変換結果の違いについて説明していました
  3. 精度依存性: 浮動小数点数の表現精度によって、必要な桁数が変わることを説明していました

更新後のコメントの意味

更新後の記述:

  • ParseFloatで元の値を完全に復元できる最小桁数を使用することを明確に記述
  • より簡潔で現在のAPIに即した説明

genericFtoa関数の役割

FormatFloatが内部的に呼び出すgenericFtoa関数は:

return string(genericFtoa(make([]byte, 0, max(prec+4, 24)), f, fmt, prec, bitSize))
  1. バッファ事前確保: make([]byte, 0, max(prec+4, 24))で適切なサイズのバッファを確保
  2. 効率的な変換: メモリ割り当てを最小化した変換処理
  3. 文字列化: 最終的に文字列として返却

可逆性の重要性

コメントで言及されている「ParseFloatで元の値を完全に復元できる」という特性は、以下の理由で重要です:

  1. データの完全性: 数値データの保存・復元時に精度が失われない
  2. シリアライゼーション: JSON、XMLなどでの数値データの正確な表現
  3. 科学計算: 高精度が要求される計算における数値の正確性

関連リンク

参考にした情報源リンク