Вопрос

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

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

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

Это было полезно?

Решение

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

однако реальная проблема (и причина, по которой вам не следует связываться с tcl_precision) заключается в том, что TCL ОВОС philosphy делает возможным, что это преобразование выполняется не только при отображении, т. е.вы могли бы создать выражение в строке, а затем выразить его или создать скрипт в строке для вычисления.оставление tcl_precicion в покое означает, что преобразование в строку обратимо, что, очевидно, важно в этих случаях.

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

Другие советы

Я не думаю, что ваш клиент прав в своем понимании.

Я полагаю, что переменная tcl_precision позволяет вам установить количество значащих цифр, которое будет отображаться Tcl при преобразовании реального значения в строку, как вы предлагаете.

Значение по умолчанию равно шести:

expr 1.11111111 + 1.11111111
=> 2.22222

Если вы установите его равным 10, вы получите:

set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222

Это не влияет на фактический метод, который Tcl использует для внутреннего представления действительного числа, которое задокументировано как double типа C, обеспечивающий точность около 15 десятичных разрядов.

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

format %6f $doubleValue

или что-то в этом роде, чтобы выдать значение в том фактическом формате, который они хотят видеть.

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

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

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

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

set x 1.123456

set tcl_preceision 2

Он будет отображать 1.12, но внутренне это все еще полное двойное значение, которое было установлено изначально.

Если вы измените значение tcl_precision обратно на "10",

Он вернется к отметке 1.13456

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top