我在日常工作中不使用Tcl。但是,我有一位同事偶尔会与希望我们的工具扩展语言更像Tcl(!)的客户进行交互。他提出的一个主题是Tcl如何让他通过全局变量tcl_precision设置精确度存储的精度。
我做了一些网络搜索,我发现的文档似乎确实是这种情况(而不仅仅是设置打印精度)。然而,看起来好像tcl_precision有一个方格的历史。我得到的印象是它完全被移除一个或两个版本,然后放回去,但有关于覆盖默认值0的警告和tut-tuts,这实际上意味着17(手册承诺足以代表任何IEEE 754双)。
所以有人可以告诉我更多关于tcl_precision 实际承诺做什么的事情,以及它对双重覆盖的双打有什么影响?它只是打印数字的全局设置,还是实际截断存储的数字的精度(这对我来说似乎很危险)?
答案 0 :(得分:4)
我认为您的客户理解不正确。
我相信tcl_precision变量允许您设置Tcl在将real转换为字符串时将显示的有效位数,如您所建议的那样。
默认设置为6:
expr 1.11111111 + 1.11111111
=> 2.22222
如果你把它设置为10,你会得到:
set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222
它不会影响Tcl用于在内部表示实数的实际方法,它被记录为C类型double,提供大约15个十进制数字的精度。
答案 1 :(得分:3)
在Tcl 8.5中,tcl_precision
全局变量应该(可能)保持单独,因为默认设置使用最小位数来表示相关的IEEE双精度。这与使用固定数字的数字不同,而是做人们通常想要的数字。如果他们想要其他东西,他们可能正在谈论格式化输出的价值;那是你想要使用的时候:
format %6f $doubleValue
或类似的东西,以他们想要看到的实际格式产生一个值。
答案 2 :(得分:2)
其他答案是正确的,tcl_precision控制浮动 - >字符串转换。
然而真正的问题(以及你不应该混淆tcl_precision的原因)是TCL的EIAS philosphy使得这种转换不仅可以在显示时完成,即你可以在字符串中构建一个表达式然后将其expr或在字符串中构建一个脚本以进行eval。单独留下tcl_precicion意味着转换为字符串是可以反转的,这在这些情况下显然很重要。
话虽如此,如果您的客户依赖于更改tcl_presicion来改变计算,他们可能并不真正知道他们在做什么。您可能想知道是否可以找到他们实际想要做的更多细节。
答案 3 :(得分:1)
tcl_precision有点滑稽,因为它听起来有误导性。
它主要影响它打印变量的方式,但不影响它在内部计算的方式。
内部tcl使用C double类型,因此使用与tcl_precision值无关的相同C double类型进行计算。
所以,如果你这样做
set x 1.123456
set tcl_preceision 2
它将显示1.12,但在内部它仍然是最初设置的完整双精度值。
如果您将tcl_precision更改回“10”
它将回到1.123456
所以你实际上并没有控制计算精度,只是它的显示方式。