在使用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
}
正如我很快发现的那样,当你使用与字符串或列表一起工作的操作(例如llength,lindex,string first,rsub,foreach等)时,变量的双重表示将被替换为将被创建的字符串表示或者是基于$tcl_precision
值创建的。此外,使用set
命令创建的此双变量的每个副本也将被破坏。
有没有办法在tcl8.4中执行此类操作后不会失去精度,并且不会强制tcl_precision
达到某个固定值?
P.S。 set tcl_precision 0
仅适用于tcl8.5或更高版本。
答案 0 :(得分:3)
从Tcl 8.5开始,您的代码应该正常工作。为了使double
s到字符串(因此到其他类型)的默认转换不丢失信息,我们付出了相当大的努力。它还试图使用最小位数来做到这一点,因为这样可以最大限度地减少向人们展示的惊喜数量;是的,我们有一位真正的专家正在研究这个问题。
对于8.4及之前,将tcl_precision
设置为17.这可以保证不会丢失有效位,尽管使用的表示可能比最小位长。