2016-11-18 2 views
2

Während ich mit tcl arbeite, entdecke ich ein solches Verhalten: wenn ich die doppelte Variable umlaufe, verliert sie ihre Präzision.Doppelte Werte verlieren Genauigkeit in tcl nach string list operations

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 
} 

Wie ich bald herausfinden, wenn Sie bestimmte Vorgänge verwenden, die mit Strings oder Listen arbeiten (zB llength, lindex, string erste, Rsub, foreach, etc.) die doppelte Darstellung der Variable wird mit String-Darstellung ersetzt werden welches erstellt wird oder früher erstellt wurde, basierend auf $tcl_precision value. Außerdem wird jede Kopie dieser doppelten Variable, die mit dem Befehl set erstellt wurde, ebenfalls verdorben.

Gibt es eine Möglichkeit, die Genauigkeit nach solchen Operationen in tcl8.4 nicht zu verlieren und ohne tcl_precision auf einen festen Wert zu zwingen?

P.S. set tcl_precision 0 funktioniert nur in tcl8.5 oder höheren Versionen.

Antwort

3

Ab Tcl 8.5 sollte Ihr Code einfach funktionieren. Erheblicher Aufwand wurde in 8.5 investiert, um die Standardkonvertierung von double s zu Strings (und damit zu anderen Typen) nicht zu verlieren. Es versucht auch, die minimale Anzahl von Ziffern dafür zu verwenden, weil dies die Menge der Überraschung minimiert, die den Menschen präsentiert wird; Ja, wir hatten einen echten Experten, der daran arbeitete.

Setzen Sie für 8.4 und vorher tcl_precision auf 17. Dies garantiert, dass keine signifikanten Bits verloren gehen, obwohl die verwendete Darstellung erheblich länger als minimal sein kann.

Verwandte Themen