首页 > 解决方案 > 用于大量小数位的类型的 TCL 编码

问题描述

我只是想知道根据 Unicode 标准,我需要使用什么格式将无理数显示到大于 16 的小数位。

我试过这样的事情:

set var [expr [format %.1000f 1] / [format %.1000f 9]]

而且仍然只能得到 1/9 到 16 位小数。

我需要为 x < 1000 增加 1/x 并查看所有小数位(最多至少为 1000)。

有小费吗 ?

标签: encodingtcl

解决方案


Tcl 的本机浮点数学使用 IEEE 双精度浮点数;那些只有大约 15 个左右有意义的有效数字(尾数中实际上有 53 位)。相反,您需要使用任意精度的浮点算术包。Tcllib 有一个math::bigfloat

package require math::bigfloat
namespace import math::bigfloat::*

# How many digits do we want
set places 1000

set x [fromstr 1.0 $places]
set y [fromstr 9.0 $places]
set z [div $x $y]
puts [tostr $z]

你也可以math::exact从 Tcllib 中使用,它在内部做的事情有点不同(你在最后的输出中指定你想要的精度):

package require math::exact
namespace import math::exact::exactexpr

# This package uses *binary* precision, not decimal
set precision [expr {ceil(log(10)/log(2) * 1000)}]

set x [[exactexpr 1] ref]
set y [[exactexpr 9] ref]
set z [[exactexpr {$x / $y}] ref]
$z asFloat $precision

ref与引用计数管理有关,因为表达式对象在内部是不平凡的。


推荐阅读