2013-06-25 177 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上閱讀更多內容。

你還會發現一些最好省略括號的實例,以及如何使用或不使用括號來改變可能看起來相同的表達式的結果。

相關問題