2016-11-18 13 views
2

tclで作業しているとき、私はそのような動作を発見します。私はすぐに見つけるとして、あなたは、文字列またはリスト(例えばllength、LINDEX、文字列の最初の、RSUB、foreachの、など)で動作する操作を使用する場合文字列リスト操作の後、double値の精度がtclで失われる

set dbl [expr { double(13.0/7.0) }] 
set dbl2 [expr { double(13.0/7.0) }] 
foreach a $dbl { 
} 
if { $dbl == $dbl2 } { 
    puts "\$dbl == \$dbl2" 
} else { 
    puts "\$dbl != \$dbl2" ;# they will be not equal 
} 

、変数の二重の表現は、文字列表現に置き換えられます$tcl_precisionの値に基づいて作成されるか、以前に作成されたものです。さらに、setコマンドで作成されたこの二重変数のすべてのコピーも損なわれます。

tcl8.4でこのような操作を行った後に精度を失うことなく、ある一定の値に強制的にtcl_precisionを強制しない方法がありますか?

P.S. set tcl_precision 0はtcl8.5以上のバージョンでのみ動作します。

答えて

3

Tcl 8.5以降では、あなたのコードはJust Workでなければなりません。 doubleの文字列への既定の変換(したがって他の型への変換)が情報を失わないようにするために、かなりの努力が8.5に加えられました。また、これは、人々に提示される驚きの量を最小限に抑えるために、最小桁数を使用してこれを実行しようとします。はい、私達はこれに取り組んでいる本当の専門家を持っていました。

8.4以前では、tcl_precisionを17に設定してください。これにより、有意なビットが失われないことが保証されますが、使用される表現は最小よりもかなり長くなる可能性があります。

関連する問題