在字符串\ list操作

时间:2016-11-18 14:51:53

标签: tcl

在使用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或更高版本。

1 个答案:

答案 0 :(得分:3)

从Tcl 8.5开始,您的代码应该正常工作。为了使double s到字符串(因此到其他类型)的默认转换不丢失信息,我们付出了相当大的努力。它还试图使用最小位数来做到这一点,因为这样可以最大限度地减少向人们展示的惊喜数量;是的,我们有一位真正的专家正在研究这个问题。

对于8.4及之前,将tcl_precision设置为17.这可以保证不会丢失有效位,尽管使用的表示可能比最小位长。