2010-02-18 4 views
5

Я не использую Tcl в своей повседневной работе. Тем не менее, у меня есть коллега, который иногда взаимодействует с клиентом, который желает, чтобы язык расширения нашего инструмента работал больше как Tcl (!). Одна из тем, которую он затронул, заключалась в том, как Tcl позволил ему установить, насколько точность была сохранена в двойном, через глобальную переменную tcl_precision.Что такое статус tcl_precision?

Я сделал несколько поисков в Интернете, и документация, которую я нашел, по-видимому, предполагает, что это так (вместо того, чтобы просто задавать точность печати). Тем не менее, похоже, что tcl_precision имеет проверочную историю. У меня создалось впечатление, что он был полностью удален для версии или двух, а затем возвращен, но с предупреждениями и ошибками об переопределении значения по умолчанию 0, что на самом деле означает 17 (что обещание вручную достаточно для представления любого IEEE 754 двойных).

Так может кто-нибудь рассказать мне больше о том, что tcl_precision на самом деле обещает сделать, и какое влияние он оказывает на парные подкрылки? Это всего лишь глобальная установка для номеров, или это действительно усекать точность чисел как хранится (что мне кажется опасным)?

ответ

2

Другие ответы верны, что tcl_precision управляет преобразованием строки float ->.

однако реальная проблема (и причина, вы не должны связываться с tcl_precision) является то, что EIAS Philosphy TCL делает возможным, что это преобразование не только сделано на дисплее то вы можете создать выражение в строку, а затем выражение это или построить скрипт в строке для eval. оставляя tcl_precicion один, означает, что преобразование в строку является обратимым, что, очевидно, важно в этих случаях.

Сказав, что, если ваш клиент полагается на изменение tcl_presicion, чтобы изменить вычисление, они, вероятно, действительно не знают, что они делают. Вы можете посмотреть, сможете ли вы узнать больше о том, что они на самом деле хотят делать.

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 десятичных цифр точности.

1

tcl_precision является немного забавным, поскольку это звучит обманчиво.

В основном это влияет на то, как он печатает переменную, но не как ее вычисляет внутри.

Внутренний tcl использует тип C double, поэтому вычисления выполняются с использованием тех же двойных типов C, которые не имеют значения tcl_precision.

Так что, если вы

set x 1.123456 

set tcl_preceision 2 

Он будет отображать 1.12, но внутренне он по-прежнему в полной мере двойной стоимости он был первоначально установлен.

Если изменить tcl_precision назад, чтобы сказать «10»

Он вернется в 1.123456

Так вы не на самом деле контроль точности расчета, насколько она будет отображаться.

3

В Tcl 8.5 глобальная переменная tcl_precision должна (вероятно) быть оставлена ​​в покое, поскольку по умолчанию используется минимальное количество цифр, чтобы точно представлять соответствующий IEEE-бит. Это не то же самое, что использовать фиксированное количество цифр, но вместо этого делает то, что обычно хотят люди. Если они хотят чего-то еще, вероятность того, что они говорят о форматировании значения для вывода; что, когда вы хотите использовать:

format %6f $doubleValue

или что-то подобное, что для получения значения в реальном формате они хотят видеть.

Смежные вопросы