float 値の計算
tclsh
% expr 0.2+0.2
0.4
% expr 0.2+0.1
0.30000000000000004
%
なぜ0.3ではないのですか??
私は何かが欠けていますか?前もって感謝します。
float 値の計算
tclsh
% expr 0.2+0.2
0.4
% expr 0.2+0.1
0.30000000000000004
%
なぜ0.3ではないのですか??
私は何かが欠けていますか?前もって感謝します。
0.1 も 0.2 も、IEEE 倍精度 2 進浮動小数点演算で正確な表現を持っていません (Tcl は、小数値を含む式に内部的に使用します。これは、適切なハードウェア サポートがあるためです)。これは、あなたが計算している値が、あなたが思っているとおりになることは決してないことを意味します。代わりに、どちらもわずかに多くなっています (たまたま、一般的にわずかに少なくなる可能性もあります)。0.2+ε 1 +0.1+ε 2を足すと、ε 1 +ε 20.3 (別の不正確に表された値) がそれより上の次の正確に表された値になるしきい値を超えるまで追加できます。これはあなたが観察したものです。また、浮動小数点演算が膨大な数の言語で機能する方法にも固有のものです。整数演算 (または 2 のべき乗の正確な倍数として表現できる分数演算 (0.5、0.25、0.125 など) のみ) が正確であることが保証されています。
ここで注目すべき唯一の興味深い点は、Tcl 8.5 および 8.6が再解析時に正確な値を取得するために必要な最小桁数で浮動小数点数をレンダリングすることを好むことです。固定桁数 (例: 8) を取得したい場合はformat
、変換時に次を使用してみてください。
format %.8f [expr 0.2+0.1]
この動作は、Ruby、Python など、ほぼすべてのプログラミング言語に存在します。
ここでの提案は、数値を浮動小数点に格納することを避け、可能な限り整数を使用することです。肝心なのは、比較で浮動小数点を使用しないことです。