2015-07-13 5 views
1

Я использую эту версию TCL /tools/tcl/8.4.11/linux64/bin/tclКак использовать встроенную функцию tcl power?

Могу ли я знать, как я могу использовать встроенную функцию питания в моем TCL скрипт?

Я пробовал это, но он не работает.

namespace import ::tcl::mathfunc::* 
puts [pow 10 2] 
 
unknown namespace in import pattern "::tcl::mathfunc::*" 
    while executing 
"namespace import ::tcl::mathfunc::\*" 

Могу ли я узнать, почему?

ответ

1

Пространство имен ::tcl::mathfunc было добавлено в Tcl 8.5 и не поддерживается в Tcl 8.4. В Tcl 8.5+ вы можете использовать

namespace import ::tcl::mathfunc::* 
pow 10 2 
# -> 100.0 

, а также вызова pow изнутри expr, но в Tcl 8.4 и более ранних версий вы должны использовать

expr {pow(10, 2)} 
# -> 100.0 

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

pow функция возвращает значение с плавающей точкой, так же, как и в C. Как Донал Стипендиаты описывает в своем ответе (QV), целое число, возведение в степень может быть задано с помощью ** оператор (который также является отдельной командой: tcl::mathop::**) , Этот оператор только Tcl 8.5+.

Документация: expr, mathfunc, mathop

+0

Спасибо, он должен получить вывод с плавающей запятой? –

+0

@ Pi-Turn Да. Ожидаемые и определенные для работы таким образом. До того, как bignums - функция 8.5 - полезный диапазон возведения в степень по целым числам был настолько мал, что мы просто не беспокоились. –

1

Эта возможность была введена в Tcl 8.5. В 8.4 и ранее функции были реализованы с использованием специального API, который никто не понимал (прохождение вокруг указателей к Tcl_Value структурам, которые были довольно странными).

Функция pow() является функцией с плавающей точкой во всех версиях Tcl (даже если она записана как вызов ::tcl::mathfunc::pow). Целое число экспоненцирование доступен только через оператора ** (требует Tcl 8.5, который был также первая версия для поддержки произвольных целых чисел размера):

puts [expr { 10 ** 2 }] 
# Note the namespace 
puts [tcl::mathop::** 10 2] 
namespace import tcl::mathop::* 
puts [** 10 2] 

** оператор точно эквивалентен pow(), если любой из его аргументов является числом с плавающей запятой (и действительно будет называть тот же функционал n в стандартной математической библиотеке C за кулисами).

+1

Чтобы уточнить неопытные, это два отдельных пространства имен: 'pow' живет в' :: tcl :: mathfunc' (для математических функций), а '**' живет в ':: tcl :: mathop' (для математических операторов). –

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