Все внутренние вычисления с целыми числами выполняются с С-типом
long, все внутренние вычисления с числами с плавающей запятой выполняются с С-типом
double.
В общем случае, обнаружение переполнения и исчезновения значения при операциях с целыми числами зависит от поведения функций конкретной библиотеки С, и потому для промежуточных результатов не может считаться надежным. Переполнение и исчезновение значения при операциях с числами с плавающей запятой обнаруживаются на аппаратном уровне, что обычно надежно обеспечивается.
При необходимости выполняются преобразования внутренних представлений операндов между целыми, строковыми и с плавающей запятой. При арифметических вычислениях используются целые числа до тех пор, пока не будет подставлено или указано число с плавающей запятой. После этого тип данных будет с плавающей запятой.
Числа с плавающей запятой возвращаются либо с точкой, либо с буквой
е, так что они заведомо не похожи на целые значения. Например:
ехрr 5 / 4
вернет «1», тогда как
ехрr 5 / 4.0
ехрr 5 / ( [string length "abcd"] + 0.0 )
оба вернут
1.25.
Выражение
ехрr 20.0/5.0
вернет
4.0, а не
4.
Операции со строками
Операторы сравнения могут работать со строковыми аргументами, хотя при вычислении выражений аргументы по возможности интерпретируются как целые или числа с плавающей запятой. Если один из операндов строковый, а другой — число, то числовой операнд будет конвертирован в строковый. Например, обе команды
ехрr {"0x03" > "2"}
ехрr {"0у" < "0x12"}
вернут
1. При этом первое сравнение будет выполнено как сравнение чисел, а второе будет выполнено как сравнение строк, после того как второй операнд будет преобразован в строку
18.
Если необходимо сравнить аргументы именно как строки, а операнды могут быть восприняты неоднозначно, то рекомендуется использовать команду
string compare вместо операторов вида ==.