Tcl 相同代码的不同结果

Tcl 相同代码的不同结果,tcl,Tcl,为什么这两段代码输出不同 set j 0.0981747704247 set i 0.0981747704247 for { ; } { $i <= 25} {set i [expr {$i + $j}]} { puts "i = $i" } 设置j 0.0981747704247 组i 0.0981747704247 对于{;}{$i来说,输出应该是相同的。但是,处理时间肯定会不同。eval中未加支撑的表达式将使函数花费更多的时间进行计算,而加支撑的表达式将快80%左右。您可以

为什么这两段代码输出不同

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

对于{;}{$i来说,输出应该是相同的。但是,处理时间肯定会不同。
eval
中未加支撑的表达式将使函数花费更多的时间进行计算,而加支撑的表达式将快80%左右。您可以在


您还会发现一些情况下,括号也可以省略,以及使用或不使用括号如何改变可能看起来相同的表达式的结果。

输出应该是相同的。但是,处理时间肯定会有所不同。
eval
中未加括号的表达式将使函数占用更多的时间e进行计算,而大括号表达式的计算速度将提高约80%。您可以在上阅读更多内容


您还将发现,在某些情况下,最好省略括号,以及使用或不使用括号如何改变表达式的结果,这些结果可能看起来相同。

在8.5之前,这两个计算的结果可能会有所不同。使用括号表达式,这些分数值将保留为d双精度浮点数,而使用无支撑表达式时,值将转换为字符串(默认情况下使用精度的15位小数),然后再转换回来。正是这些转换导致了值的更改

从Tcl 8.5开始,双精度浮点序列化引擎已更改,因此它将序列化为尽可能短的字符串表示形式,该字符串表示形式将反序列化回相同的IEEE double。这意味着这两个脚本(仅在是否使用括号方面有所不同)的行为相同再一次,填补了一个微妙的语义漏洞


但您仍然应该支持表达式,因为这样Tcl就可以积极使用高效的处理来处理您的代码。这也意味着——因为您没有重新编译表达式——您永远不会遇到错误的“
[file delete-force”/“]
”或其他类似的奇怪用户输入问题(因为它只是“不是有效数字”而不是“一段脚本”).

在8.5之前,这两种评估的结果很可能不同。对于大括号表达式,这些分数值将保留为IEEE双精度浮点数,而对于无括号表达式,值将转换为字符串(默认情况下使用精度的15位小数)然后再转换回来。正是这些转换导致了值的变化

从Tcl 8.5开始,双精度浮点序列化引擎已更改,因此它将序列化为尽可能短的字符串表示形式,该字符串表示形式将反序列化回相同的IEEE double。这意味着这两个脚本(仅在是否使用括号方面有所不同)的行为相同再一次,填补了一个微妙的语义漏洞


但您仍然应该支持表达式,因为这样Tcl就可以积极使用高效的处理来处理您的代码。这也意味着——因为您没有重新编译表达式——您永远不会遇到错误的“
[file delete-force”/“]
”或其他类似的奇怪用户输入问题(因为它只是“不是有效数字”而不是“一段脚本”).

我有tcl 8.5.13,结果是一样的。告诉我们区别是什么?这不是捉迷藏。@andy Floats和无支撑表达式?很容易猜出问题所在。我有tcl 8.5.13,结果是一样的。告诉我们区别是什么?这不是捉迷藏。@andy Floats和u有标签的表达式?很容易猜出问题是什么。
set j 0.0981747704247
set i 0.0981747704247
for {; } { $i <= 25 } {set i [expr $i + $j]} {
    puts "i = $i"
}