Каково состояние tcl_precision?

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

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

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

5
задан Don Wakefield 18 February 2010 в 04:37
поделиться

4 ответа

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

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

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

2
ответ дан 13 December 2019 в 22:06
поделиться

Можно ли выполнить ping ud06 (как ud06, а не ud06.us.server.com)?

Что показывает команда

lsnrctl services

?

EDIT: Мне кажется, что имя экземпляра базы данных на самом деле не «orcl»? Выходные данные служб lsnrctl указывают на то, что служба «orcl», хотя и определена в файле listener.ora, на самом деле не выполняется.

Можете ли вы войти в систему с прямым подключением к серверу? Если да, то что используется в качестве значения переменной среды ORACLE_SID? Войдите в систему как пользователь SYS и выполните команду

ALTER SYSTEM REGISTER;

Затем снова выполните команду lsnrctl services и проверьте, не отображается ли дополнительный экземпляр.

Также, как указывает Алекс, команда tnsping сообщает полное имя службы. Измените файл sqlnet.ora и установите для NAMES.DEFAULT_DOMAIN значение NULL, если оно имеет значение.

EDIT 2: Работает ли tnsping ud06 на сервере ? Или мое предположение, что клиент и сервер находятся в разных системах неправильно?

-121--3665235-

Пытались ли вы использовать расширения AR для массового импорта? Вы получаете впечатляющие улучшения производительности при вставке 1000-х строк в БД. Для получения дополнительной информации посетите веб-сайт .

См. эти примеры для получения дополнительной информации

Пример использования 1

Пример использования 2

Пример использования 3

-121--4667573-

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

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

настройка по умолчанию - шесть:

expr 1.11111111 + 1.11111111
=> 2.22222

Если установить значение 10, то получится:

set tcl_precision 10
expr 1.11111111 + 1.11111111
=> 2.22222222

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

4
ответ дан 13 December 2019 в 22:06
поделиться

tcl_precision немного забавный, так как звучит обманчиво.

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

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

Таким образом, если вы сделаете

set x 1.123456

set tcl_preceision 2

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

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

, он вернется к 1.123456

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

1
ответ дан 13 December 2019 в 22:06
поделиться

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

формат% 6f $ doubleValue

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

3
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: