tcl_precision的状态是什么?

时间:2010-02-18 04:37:48

标签: floating-point tcl floating-accuracy ieee-754

我在日常工作中不使用Tcl。但是,我有一位同事偶尔会与希望我们的工具扩展语言更像Tcl(!)的客户进行交互。他提出的一个主题是Tcl如何让他通过全局变量tcl_precision设置精确度存储的精度。

我做了一些网络搜索,我发现的文档似乎确实是这种情况(而不仅仅是设置打印精度)。然而,看起来好像tcl_precision有一个方格的历史。我得到的印象是它完全被移除一个或两个版本,然后放回去,但有关于覆盖默认值0的警告和tut-tuts,这实际上意味着17(手册承诺足以代表任何IEEE 754双)。

所以有人可以告诉我更多关于tcl_precision 实际承诺做什么的事情,以及它对双重覆盖的双打有什么影响?它只是打印数字的全局设置,还是实际截断存储的数字的精度(这对我来说似乎很危险)?

4 个答案:

答案 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

所以你实际上并没有控制计算精度,只是它的显示方式。