[インデックス 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言語的でない設計に刷新されていました。
主な背景:
- API統合:
Atof32
、Ftoa32
、Ftoa64
などの個別の関数が廃止され、ParseFloat
、FormatFloat
という統一的な関数に置き換えられました - コメントの陳腐化: 古いAPI名を参照するコメントが残存していたため、現在の関数名に合わせて更新が必要でした
- Go 1.0準備: 2012年3月のGo 1.0リリースに向けて、ドキュメンテーションの整合性を保つ必要がありました
前提知識の解説
strconvパッケージとは
strconvパッケージは、文字列と基本データ型(数値、ブール値)間の変換を行うGoの標準ライブラリです。特に浮動小数点数の変換において、精度を保った変換を提供します。
浮動小数点数の文字列変換の複雑さ
浮動小数点数の文字列変換は、以下の理由により技術的に複雑です:
- IEEE 754標準: 浮動小数点数は内部的にバイナリ表現で格納されているため、10進数への変換で精度の問題が発生します
- 丸め誤差: 変換時に最適な丸め方法を選択する必要があります
- 精度制御: 異なる精度(float32、float64)に対応する必要があります
- 可逆性: 文字列から浮動小数点数への変換で元の値を完全に復元できる必要があります
古いAPIの問題点
Go 1.0以前のAPIには以下の問題がありました:
- 関数の乱立:
Atof32
、Atof64
、Ftoa32
、Ftoa64
など、精度ごとに個別関数が存在 - C言語的命名:
atof
(ASCII to float)のような、C言語の影響を受けた命名規則 - 一貫性の欠如: 他のパッケージとの命名規則の不整合
技術的詳細
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パッケージの浮動小数点変換は、以下のアルゴリズムを使用:
- 仮数部の多倍長10進数保存: バイナリ仮数部を10進数の多倍長数値として保存
- 指数による桁シフト: 2進指数を10進桁シフトに変換
- 桁読み取りとフォーマット: 必要な桁数を読み取り、指定されたフォーマットで出力
コアとなるコードの変更箇所
変更箇所は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))
}
コアとなるコードの解説
削除されたコメントの意味
削除された部分の技術的意味:
Atof32
への参照: 古いAPI名への参照が残存していましたFtoa32
とFtoa64
の相違点: 異なる精度での変換結果の違いについて説明していました- 精度依存性: 浮動小数点数の表現精度によって、必要な桁数が変わることを説明していました
更新後のコメントの意味
更新後の記述:
ParseFloat
で元の値を完全に復元できる最小桁数を使用することを明確に記述- より簡潔で現在のAPIに即した説明
genericFtoa関数の役割
FormatFloat
が内部的に呼び出すgenericFtoa
関数は:
return string(genericFtoa(make([]byte, 0, max(prec+4, 24)), f, fmt, prec, bitSize))
- バッファ事前確保:
make([]byte, 0, max(prec+4, 24))
で適切なサイズのバッファを確保 - 効率的な変換: メモリ割り当てを最小化した変換処理
- 文字列化: 最終的に文字列として返却
可逆性の重要性
コメントで言及されている「ParseFloat
で元の値を完全に復元できる」という特性は、以下の理由で重要です:
- データの完全性: 数値データの保存・復元時に精度が失われない
- シリアライゼーション: JSON、XMLなどでの数値データの正確な表現
- 科学計算: 高精度が要求される計算における数値の正確性
関連リンク
- Go 1.0リリースノート - strconvパッケージの変更点について
- strconvパッケージドキュメント - 現在のAPI仕様
- IEEE 754標準 - 浮動小数点数の標準規格