2013-06-25 147 views
0

为什么这两段代码输出不同?相同代码的不同结果

set j 0.0981747704247 
set i 0.0981747704247 
for { ; } { $i <= 25} {set i [expr {$i + $j}]} { 
    puts "i = $i" 
} 
set j 0.0981747704247 
set i 0.0981747704247 
for {; } { $i <= 25 } {set i [expr $i + $j]} { 
    puts "i = $i" 
} 
+0

我有tcl 8.5.13,结果是一样的。 –

+2

如何告诉我们有什么不同?这不是隐藏和寻求。 –

+0

@andy花车和无支撑的表情?很容易猜到问题是什么。 –

回答

2

在8.5,之前,这两个评估的结果可能会有所不同。使用支撑表达式,这些小数值将保留为IEEE双精度浮点数,而对于无支配的表达式,值将被转换为字符串(默认情况下使用15位精度的十进制数字),然后再转换回来。这是导致价值变化的转换。

在Tcl的8.5开始,双精度浮点序列化引擎被改变,使得它,而不是序列化到最短的字符串表示将被反序列化回相同IEEE双。这意味着这两个脚本 - 不同之处在于事物是否被支撑 - 再次表现相同,从而关闭了一个微妙的语义漏洞。

但是你仍然应该支持你的表达式,因为Tcl可以主动使用高效的处理来处理你的代码。这也意味着 - 因为你没有重新编译表达式 - 你不可能遇到一个流浪的“[file delete -force "/"]”或其他这样奇怪的用户输入问题(因为它只是“不是一个有效的数字”而不是“一小段脚本“)。

1

输出应是相同的。但是,处理时间肯定会有所不同。 eval中的无支配表达式将使函数花费更多时间进行评估,而支撑表达式则会快80%左右。您可以在wiki上阅读更多内容。

你还会发现一些最好省略括号的实例,以及如何使用或不使用括号来改变可能看起来相同的表达式的结果。

相关问题