Глава 11 - Математика
REBOL/Core Руководство пользователя Основное содержание Send Us Feedback
Содержание:
1. Обзор
2. Скалярные типы данных
3. Порядок оценки
4. Стандартные функции и операторы
4.1 absolute
4.2 add
4.3 complement
4.4 divide
4.5 multiply
4.6 negate
4.7 random
4.8 remainder
4.9 subtract
5. Преобразование типов
6. Функции сравнения
6.1 equal
6.2 greater
6.3 greater-or-equal
6.4 lesser
6.5 lesser-or-equal
6.6 not equal to
6.7 same
6.8 strict-equal
6.9 strict-not-equal
7. Логарифмические функции
7.1 exp
7.2 log-10
7.3 log-2
7.4 log-e
7.5 power
7.6 square-root
8. Тригонометрические функции
8.1 arccosine
8.2 arcsine
8.3 arctangent
8.4 cosine
8.5 sine
8.6 tangent
9. Логические функции
9.1 and
9.2 or
9.3 xor
9.4 complement
9.5 not
10. Ошибки
10.1 Попытка деления на ноль
10.2 Математическое или числовое переполнение
10.3 Требуется положительное число
10.4 Невозможно используйте оператор для значений типа datatype!
1. Обзор
REBOL предоставляет полный набор математических и тригонометрических операций. Многие из этих операторов могут обрабатывать несколько типов данных, включая целые, десятичные, деньги, кортежи, время и дату. Некоторые из этих типов данных могут даже быть смешанными или принудительными.
2. Скалярные типы данных
Математические функции REBOL работают согласованно с широким спектром скалярных (числовых) типов данных. Эти типы данных включают:
|
Тип данных
|
Описание
|
|---|
|
Integer!(Целое!)
|
32-битные числа без десятичной точки
|
|
Decimal!(Десятичный!)
|
64-битные числа с плавающей запятой
|
|
Money!(Деньги!)
|
валюта с 64-битным числом с плавающей запятой
|
|
Time!(Время!)
|
часы, минуты, секунды и доли секунды
|
|
Date!(Дата!)
|
день, месяц, год, время, часовой пояс
|
|
Pair!(Пара!)
|
графическое положение или размер
|
|
Tuple!(Кортеж!)
|
версии, цвета, сетевые адреса
|
Ниже приведены несколько примеров, демонстрирующих ряд математических операций над скалярными типами данных. Обратите внимание, что операторы дают полезные результаты для каждого типа данных.
В integer (целочисленных) и decimal (десятичных) типах данных:
print 2 + 1
3
print 2 - 1
1
print 2 * 10
20
print 20 / 10
2
print 21 // 10
1
print 2.2 + 1
3.2
print 2.2 - 1
1.2
print 2.2 * 10
22
print 2.2 / 10
0.22
print random 10
5
В time (время) типе данных:
print 2:20 + 1:40
4:00
print 2:20 + 5
2:20:05
print 2:20 + 60
2:21
print 2:20 + 2.2
2:20:02.2
print 2:20 - 1:20
1:00
print 2:20 - 5
2:19:55
print 2:20 - 120
2:18
print 2:20 * 2
4:40
print 2:20 / 2
1:10
print 2:20:01 / 2
1:10:00.5
print 2:21 // 2
0:00
print - 2:20
-2:20
print random 10:00
5:30:52
В date (дата) типе данных:
print 1-Jan-2000 + 1
2-Jan-2000
print 1-Jan-2000 - 1
31-Dec-1999
print 1-Jan-2000 + 31
1-Feb-2000
print 1-Jan-2000 + 366
1-Jan-2001
birthday: 7-Dec-1944
print ["Я живу " (now/date - birthday) " дней."]
Я живу 20305 дней.
print random 1-1-2000
29-Apr-1695
В money (деньги) типе данных:
print $2.20 + $1
$3.20
print $2.20 + 1
$3.20
print $2.20 + 1.1
$3.30
print $2.20 - $1
$1.20
print $2.20 * 3
$6.60
print $2.20 / 2
$1.10
print $2.20 / $1.10
2
print $2.21 // 2
$0.21
print random $10.00
$6.00
В pair (пара) типе данных:
print 100x200 + 10x20
110x220
print 10x10 + 3
13x13
print 10x20 * 2x4
20x80
print 100x100 * 3
300x300
print 100x30 / 10x3
10x10
print 100x30 / 10
10x3
print 101x32 // 10x3
1x2
print 101x32 // 10
1x2
print random 100x20
67x12
В tuple (кортеж) типе данных:
print 1.2.3 + 3.2.1
4.4.4
print 1.2.3 - 1.0.1
0.2.2
print 1.2.3 * 3
3.6.9
print 10.20.30 / 10
1.2.3
print 11.22.33 // 10
1.2.3
print 1.2.3 * 1.2.3
1.4.9
print 10.20.30 / 10.20.30
1.1.1
print 1.2.3 + 7
8.9.10
print 1.2.3 - 1
0.1.2
print random 10.20.30
8.18.12
3. Порядок оценки
При вычислении математических выражений следует помнить два правила:
- Выражения: оцениваются слева направо.
- Операторы имеют приоритет над функциями.
Оценка выражений слева направо не зависит от типа используемого оператора. Например:
print 1 + 2 * 3
9
Обратите внимание, что в приведённом выше примере результат не равен семи, как в случае, если бы умножение имело приоритет перед сложением.
Важная заметка
Способ вычисления математических выражений слева направо независимо от оператора отличается от многих других компьютерных языков. Во многих языках есть правила приоритета, которые вы должны помнить, определяющие порядок вычисления операторов. Например, умножение выполняется перед сложением. В некоторых языках есть 10 или более таких правил.
В REBOL вместо того, чтобы требовать от пользователей запоминания приоритета операторов, вам нужно помнить только правило письма слева направо. Что ещё более важно, для расширенного кода, такого как Выражения:, которые обрабатывают Выражения: (например, в отражении), вам не нужно переупорядочивать термины на основе приоритета. Порядок оценки остаётся простым.
Для большинства математических выражений правило вычисления слева направо работает достаточно хорошо и его легко запомнить. Однако, поскольку это правило отличается от других языков, оно может быть источником ошибок программирования, так что будьте осторожны.
Лучшее решение - проверить свою работу. Вы также можете использовать круглые скобки, если необходимо, чтобы пояснить своё выражение (см. ниже), и вы всегда можете ввести своё выражение в консоли, чтобы проверить свой результат.
Если вам нужно выполнить оценку в другом порядке, измените порядок Выражения: или используйте круглые скобки:
print 2 * 3 + 1
7
print 1 + (2 * 3)
7
Когда функции смешиваются с операторами, сначала оцениваются операторы, а затем функции:
print absolute -10 + 5
5
В приведённом выше примере сначала выполняется сложение, а его результат предоставляется функции absolute.
В следующем примере:
print 10 + sine 30 + 60
11
выражение оценивается в следующем порядке:
30 + 60 => 90
sine 90 => 1
10 + 1 => 11
print
Чтобы изменить порядок так, чтобы сначала использовался синус 30, используйте круглые скобки:
print 10 + (sine 30) + 60
70.5
или измените порядок Выражения:
print 10 + 60 + sine 30
70.5
4. Стандартные функции и операторы
В этом разделе описаны стандартные математические функции и операторы, используемые в REBOL.
4.1 absolute (абсолютное)
Выражения:
absolute value
abs value
вернуть абсолютное (по модулю, т.е. положительное) значение value.
Работает со следующими типами данных - integer(целыми), decimal(десятичными), money(деньги), time(время), pair(пары).
print absolute -10
10
print absolute -1.2
1.2
print absolute -$1.2
$1.20
print absolute -10:20
10:20
print absolute -10x-20
10x20
4.2 add (добавить)
Выражения:
значение1 + значение2
добавить значение1 значение2
возвращает результат добавления value1 к значение2 .
Работает с типами данных integer , decimal , money , time , tuple , pair , date , char .
Выражения:
value1 + value2
add value1 value2
возвращает результат добавления value1 к value2.
Работает со следующими типами данных integer(целыми), decimal(десятичными),
money(деньги), time(время), tuple(кортеж),
pair(пары), date(дата), char(символ).
print 1 + 2
3
print 1.2 + 3.4
4.6
print 1.2.3 + 3.4.5
4.6.8
print $1 + $2
$3.00
print 1:20 + 3:40
5:00
print 10x20 + 30x40
40x60
print #"A" + 10
K
print add 1 2
3
4.3 complement (дополнение)
Выражение:
complement value
Возвращает числовое дополнение (побитовое дополнение) значения.
Возвращает значение дополнения до единицы для value.
Работает со следующими типами данных integer(целыми), decimal(десятичными), tuple(кортеж).
print complement 10
-11
print complement 10.5
-11
print complement 100.100.100
155.155.155
4.4 divide (деление)
Выражения:
value1 / value2
divide value1 value2
возвращает результат деления value1 на value2.
Работает со следующими типами данных integer(целыми), decimal(десятичными),
money(деньги), time(время), tuple(кортеж),
pair(пары), char(символ).
print 10 / 2
5
print 1.2 / 3
0.4
print 11.22.33 / 10
1.2.3
print $12.34 / 2
$6.17
print 1:20 / 2
0:40
print 10x20 / 2
5x10
print divide 10 2
5
4.5 multiply (умножение)
Выражения:
value1 * value2
multiply value1 value2
возвращает результат умножения value1 на value2.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж),pair(пары), char(символ).
print 10 * 2
20
print 1.2 * 3.4
4.08
print 1.2.3 * 3.4.5
3.8.15
print $10 * 2
$20.00
print 1:20 * 3
4:00
print 10x20 * 3
30x60
print multiply 10 2
20
4.6 negate (отрицание)
Выражения:
- value
negate value
изменить знак value.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время),pair(пары).
print - 10
-10
print - 1.2
-1.2
print - $10
-$10.00
print - 1:20
-1:20
print - 10x20
-10x-20
print negate 10
-10
4.7 random (случайный)
Выражение:
random value
возвращает случайное значение, которое меньше или равно заданному значению.
Обратите внимание, что для целых чисел random начинается с 1, а не с 0, и включает данное значение. Это позволяет использовать random напрямую с такими функциями, как pick.
Когда используется десятичное число, результатом является десятичный тип данных, округлённый до целого числа.
Уточнение /seed перезапускает генератор случайных чисел. Используйте уточнение
/seed если вы хотите генерировать уникальные случайные числа. Вы можете использовать текущую дату и время, чтобы сделать начальное число более случайным:
random/seed now
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж),pair(пары), char(символ), string(строка), block(блок).
print random 10
5
print random 10.5
2
print random 100.100.100
79.95.66
print random $100
$32.00
print random 10:30
6:37:33
print random 10x20
2x4
print random 30-Jun-2000
27-Dec-1171
4.8 remainder (остаток)
Выражения:
value1 // value2
remainder value1 value2
Возвращает остаток от первого значения, делённого на второе.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж),pair(пары).
print 11 // 2
1
print 11.22.33 // 10
1.2.3
print 11x22 // 2
1x0
print remainder 11 2
1
4.9 subtract (вычесть)
Выражения:
value1 - value2
subtract value1 value2
возвращает результат вычитания value2 из value1.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж),pair(пары), char(символ), data(дата).
print 2 - 1
1
print 3.4 - 1.2
2.2
print 3.4.5 - 1.2.3
2.2.2
print $2 - $1
$1.00
print 3:40 - 1:20
2:20
print 30x40 - 10x20
20x20
print #"Z" - 1
Y
print subtract 2 1
1
5. Преобразование типов
Когда между типами данных выполняются математические операции, обычно возвращается нецелочисленный или недесятичный тип данных. Когда целые числа комбинируются с десятичными числами, возвращается десятичный тип данных.
6. Функции сравнения
Все функции сравнения возвращают либо true (истина) или false (ложь).
6.1 equal (равно)
Выражения:
value1 = value2
equal? value1 value2
вернёт true (истину) если первое и второе значения равны..
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж), char(символ), data(дата) и series (серия).
print 11-11-99 = 11-11-99
true
print equal? 111.112.111.111 111.112.111.111
true
print #"B" = #"B"
true
print equal? "a b c d" "A B C D"
true
6.2 greater (больше)
Выражения:
value1 > value2
greater? value1 value2
Возвращает true истину если первое значение больше второго.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж), char(символ), data(дата) и series (серия).
print 13-11-99 > 12-11-99
true
print greater? 113.111.111.111 111.112.111.111
true
print #"C" > #"B"
true
print greater? [12 23 34] [12 23 33]
true
6.3 greater-or-equal (больше или равно)
Выражения:
value1 >= value2
greater-or-equal? value1 value2
Возвращает true истину если первое значение больше или равно второму.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж), char(символ), data(дата) и series (серия).
print 11-12-99 >= 11-11-99
true
print greater-or-equal? 111.112.111.111 111.111.111.111
true
print #"B" >= #"A"
true
print greater-or-equal? [b c d e] [a b c d]
true
6.4 lesser (меньше)
Выражения:
value1 < value2
lesser? value1 value2
Вернёт true если первое значение меньше второго.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж), char(символ), data(дата) и series (серия).
print 25 < 50
true
print lesser? 25.3 25.5
true
print $2.00 < $2.30
true
print lesser? 00:10:11 00:11:11
true
6.5 lesser-or-equal (меньше или равно)
Выражения:
value1 <= value2
lesser-or-equal? value1 value2
Вернёт true если первое значение меньше или равно второму
value.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж), char(символ), data(дата) и series (серия).
print 25 <= 25
true
print lesser-or-equal? 25.3 25.5
true
print $2.29 <= $2.30
true
print lesser-or-equal? 11:11:10 11:11:11
true
6.6 not equal to (не равно)
Выражения:
value1 <> value2
not-equal? value1 value2
Вернёт true если первое значение не равно второму.
Работает со следующими типами данных: integer(целыми), decimal(десятичными),money(деньги), time(время), tuple(кортеж), char(символ), data(дата) и series (серия).
print 26 <> 25
true
print not-equal? 25.3 25.5
true
print $2.29 <> $2.30
true
print not-equal? 11:11:10 11:11:11
true
6.7 same (то же)
Выражения:
value1 =? value2
same? value1 value2
Вернёт true если два слова относятся к одному и тому же значению. Например, если вы хотите увидеть, ссылаются ли два слова на один и тот же индекс в серии.
Работает со всеми типами данных.
reference-one: "abcdef"
reference-two: reference-one
print same? reference-one reference-two
true
reference-one: next reference-one
print same? reference-one reference-two
false
reference-two: next reference-two
print same? reference-one reference-two
true
reference-two: copy reference-one
print same? reference-one reference-two
false
6.8 strict-equal (строго равное)
Выражения:
value1 == value2
strict-equal? value1 value2
вернуть true, если первое и второе значения строго совпадают. Может использоваться как эквивалентная версия equal? (с учётом регистра) (=) для строк и различать целые и десятичные числа, когда их значения совпадают.
Работает со всеми типами данных.
print strict-equal? "abc" "ABC"
false
print equal? "abc" "ABC"
true
print strict-equal? "abc" "abc"
true
print strict-equal? 1 1.0
false
print equal? 1 1.0
true
print strict-equal? 1.0 1.0
true
6.9 strict-not-equal (строго-не-равный)
Выражения:
strict-not-equal? value1 value2
Возвращает true, если первое и второе значения строго не совпадают. Может использоваться как not-equal? (чувствительная к регистру) версия неравенства (<>) для строк и различать целые и десятичные числа, когда их значения совпадают.
Работает со всеми типами данных.
print strict-not-equal? "abc" "ABC"
true
print not-equal? "abc" "ABC"
false
print strict-not-equal? "abc" "abc"
false
print strict-not-equal? 1 1.0
true
print not-equal? 1 1.0
false
print strict-not-equal? 1.0 1.0
false
7. Логарифмические функции.
7.1 exp
Выражения:
exp value
Возвращает экспоненту E (натуральное число) в степени value.
7.2 log-10
Выражения:
log-10 value
Возвращает десятичный логарифм числа value.
7.3 log-2
Выражения:
log-2 value
возвращает логарифм значения по основанию 2 для value.
7.4 log-e
Выражения:
log-e value
Возвращает натуральный логарифм числа value.
7.5 power
Выражения:
value1 ** value2
power value1 value2
Возвращает результат возведения в степень value2 числа value1.
7.6 square-root
Выражения:
square-root value
Возвращает квадратный корень числа value.
8. Тригонометрические функции
Тригонометрические функции имеют дело с градусами. Используйте уточнение /radians с любой из тригонометрических функций, чтобы работать и возвращать радианы.
8.1 arccosine
Выражения:
arccosine value
Возвращает значение арккосинуса числа value.
8.2 arcsine
Выражения:
arcsine value
Возвращает значение арксинуса числа value.
8.3 arctangent
Выражения:
arctangent value
Возвращает значение арктангенса числа value.
8.4 cosine
Выражения:
cosine value
Возвращает значение косинуса числаvalue.
8.5 sine
Выражения:
sine value
Возвращает значение синуса числа value.
8.6 tangent
Выражения:
tangent value
Возвращает значение тангенса value.
9. Логические функции
Логические функции могут выполняться над логическими значениями и некоторыми скалярными значениями, включая целые числа (integer), символы (char), кортежи (tuple) и биты (bitset). При работе с логическими значениями логические функции возвращают логические значения. При работе с другими типами значений логика работает с битами.
9.1 and (и)
Функция and сравнивает два логических значения и возвращает true(истину), если они оба верны:
print (1 < 2) and (2 < 3)
true
print (1 < 2) and (4 < 3)
false
При использовании целых чисел, функция and сравнивает биты одного числа с битами второго и возвращает число, в котором установлены в единицу только те биты, в которых была единица в обоих числах одновременно:
print 3 and 5
1
9.2 or (или)
Функция or сравнивает два логических значения и возвращает true если хоть одно из значений true:
print (1 < 2) or (2 < 3)
true
print (1 < 2) or (4 < 3)
true
print (3 < 2) or (4 < 3)
false
При использовании целых чисел or сравнивает биты обоих чисел и если хоть в одном из них бит в единице, то в результате бит так же устанавливается в 1:
print 3 or 5
7
9.3 xor
Функция xor сравнивает два логических значения и возвращает true (истину) тогда и только тогда, когда одно из значений истинно, а другое ложно.
print (1 < 2) xor (2 < 3)
false
print (1 < 2) xor (4 < 3)
true
print (3 < 2) xor (4 < 3)
false
При использовании с целыми числами xor сравнивает бит с битом и возвращает 1 тогда и только тогда, когда один бит равен 1, а другой 0 . В противном случае возвращается 0:
print 3 xor 5
6
9.4 complement
Функция complement возвращает логическое или побитовое дополнение значения. Он используется для целых чисел битовой маски и инвертирования битовых наборов.
print complement true
false
print complement 3
-4
9.5 not (нет)
Для логического значения not возвращает true (истина), если значение ложно, и false (ложь), если значение истинно. Он не выполняет числовые побитовые операции.
print not true
false
print not false
true
10. Ошибки
Математические ошибки сообщаются, когда выполняется недопустимая операция или когда происходит переполнение или потеря значимости. В математических операциях могут встречаться следующие ошибки.
10.1 Попытка деление на ноль
Была сделана попытка разделить число на 0.
1 / 0
** Math Error: Attempt to divide by zero
** Where: connect-to-link
** Near: 1 / 0
10.2 Математическое или числовое переполнение
Была сделана попытка обработать число, слишком большое для обработки в REBOL.
1E+300 + 1E+400
** Math Error: Math or number overflow
** Where: connect-to-link
** Near: 1 / 0
10.3 Требуется положительное число
Была предпринята попытка обработать отрицательное число математическим оператором, который принимает только положительные числа.
log-10 -1
** Math Error: Positive number required
** Where: connect-to-link
** Near: log-10 -1
10.4 Невозможно использовать оператор для значения данного типа данных.
Была сделана попытка обработать несовместимые типы данных. Тип данных второго аргумента в операции возвращается, как указано.
10:30 + 1.2.3
** Script Error: Cannot use add on time! value
** Where: connect-to-link
** Near: 10:30 + 1.2.3
|