使用tcl时,我发现了这样的一种现象:当我遍历double变量时,它失去了精度。
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
}
我很快就会发现,当您使用适用于字符串或列表的操作(例如,llength,lindex,字符串优先,rsub,foreach等)时,变量的双精度表示将被将要创建或已创建的字符串表示代替。早期,基于$tcl_precision
价值。此外,使用set
命令创建的这个double变量的每个副本也将被破坏。
有没有一种方法可以在tcl8.4中进行此类操作并且不强制tcl_precision
达到某个固定值后又不会失去精度?
PSset tcl_precision 0
仅适用于tcl8.5或更高版本。
从Tcl 8.5开始,您的代码应该可以正常工作。在8.5中付出了巨大的努力,以使double
s到字符串(因此到其他类型)的默认转换不会丢失信息。它还尝试使用最小位数进行此操作,其理由是这样可以最大程度地减少给人们带来的惊喜。是的,我们有一位真正的专家在为此工作。
对于8.4及更早版本,将其设置tcl_precision
为17。这可以确保不会丢失任何有效位,尽管所使用的表示可能比最小的要长得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句