tcl浮点数处理

时间:2018-08-04 13:52:07

标签: tcl

我才刚刚开始学习TCL。在其Tutorial page上,有一部分描述如下:

  

1.2 / 0.1的结果为11.999999999999998,而不是12。这是当今大多数计算机和编程语言的一个非常讨厌的方面的示例:它们不适用于普通的十进制小数,而适用于二进制小数。因此,可以精确表示0.5,但是不能精确表示0.1。

我不知道这到底意味着什么。我尝试了以下方法:

% expr {1.2 / 0.1}
11.999999999999998
% expr {1.2 / 0.5}
2.4
% expr {1.2 / 0.4}
2.9999999999999996
% expr {1.2 / 0.3}
4.0

就像它描述的那样,1.2 / 0.5将给出确切的答案。但是用0.1作为除数,就不会。

有人可以解释一下这里的机制吗?谢谢。

3 个答案:

答案 0 :(得分:3)

In short, this is not a Tcl specific issue but rather a consequence of representing decimal numbers using binary digits.

A wikipedia article is here仅更改页面的一部分。 here是更详细的解释。

答案 1 :(得分:1)

现在,您知道不是特定于Tcl的,您可能仍想探索在Tcl中进行编程时的前进方式。由math::exact module of tcllib

提供的教育起点是exactexpr

举个例子:

package req math::exact
namespace import math::exact::*
set a [[exactexpr {12/10}] ref]
set b [[exactexpr {1/10}] ref]
set c [[exactexpr {$a / $b}] ref]
$c asFloat 8; # returns '1.2e1'
$a unref; $b unref; $c unref;

答案 2 :(得分:1)

https://wiki.tcl.tk/1650

从Tcl 8.5开始,不建议将$ tcl_precision更改为默认值0以外的其他值。如果需要控制浮点值的显示精度,请使用格式(例如,格式%.12g $ x)。

% set tcl_precision 12
12
% set a [expr 1.00000000000123]
1.0
% set b [expr 1.0]
1.0
% expr { $a == $b }
0
% expr { $a eq $b }
1