5

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

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

那么谁能告诉我更多关于 tcl_precision实际承诺做什么,以及它对隐藏的双打有什么影响?它只是打印数字的全局设置,还是实际上截断了存储数字的精度(这对我来说似乎很危险)?

4

4 回答 4

4

我认为您的客户的理解不正确。

我相信 tcl_precision 变量允许您设置 Tcl 在将实数转换为字符串时将显示的有效位数,正如您所建议的那样。

默认设置为六:

expr 1.11111111 + 1.11111111
=> 2.22222

如果将其设置为 10,您将获得:

set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222

它不影响 Tcl 用来在内部表示实数的实际方法,它被记录为 C 类型的双精度数,提供大约 15 位十进制数字的精度。

于 2010-02-18T04:49:33.797 回答
3

在 Tcl 8.5 中,tcl_precision全局变量应该(可能)单独保留,因为默认设置使用最小位数来准确表示相关的 IEEE 双精度。这与使用固定位数不同,而是做人们通常想要的。如果他们想要别的东西,很可能他们正在谈论格式化输出值;那是你想要使用的时候:

format %6f $doubleValue

或类似的东西以他们想要看到的实际格式产生一个值。

于 2010-03-25T15:48:36.250 回答
2

其他答案是正确的 tcl_precision 控制 float -> string 转换。

然而真正的问题(以及你不应该与 tcl_precision 混淆的原因)是 TCL 的EIAS理念使得这种转换不仅在显示时完成,即你可以在字符串中构建一个表达式,然后 expr 它或构建一个字符串中的脚本以进行评估。单独留下 tcl_precicion 意味着转换为字符串是可逆的,这在这些情况下显然很重要。

话虽如此,如果您的客户依赖更改 tcl_presicion 来更改计算,他们可能并不真正知道自己在做什么。你可能想看看你是否能找到更多关于他们真正想做的事情的细节。

于 2010-02-22T15:14:37.270 回答
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

因此,您实际上并没有控制计算精度的显示方式。

于 2010-02-20T23:08:58.547 回答