Кодировка TCL для типа для большого количества десятичных знаков - PullRequest
0 голосов
/ 30 апреля 2020

Я просто хочу знать, какой формат мне нужно использовать для отображения иррациональных чисел в десятичных разрядах, больших 16, согласно стандарту Unicode.

Я пробовал такие вещи, как:

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

И все же получим только от 1/9 до 16 десятичных знаков.

Мне нужно увеличить 1 / x для x <1000 и увидеть все десятичные знаки (до как минимум 1000). </p>

Любые советы?

1 Ответ

0 голосов
/ 30 апреля 2020

В математике с плавающей точкой Tcl используются значения с плавающей запятой IEEE; в них только около 15 значимых значащих цифр (в мантиссе фактически 53 бита). Вместо этого вам нужно использовать пакет с арифметикой произвольной точности c. 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 связан с управлением счетчиком ссылок, потому что объекты выражения внутренне нетривиальны.

...