Справочник языка
Модуль, знак, границы и случайные числа
Часть числовых задач сводится к работе с величиной и направлением: убрать знак, определить, в какую сторону меняется значение, выбрать меньшее или большее из двух, удержать результат в допустимых пределах. Эти операции выполняют ABS, SGN, MIN, MAX, CLAMP и SETSIGN, а случайные исходы даёт RND. Каждая функция имеет собственный договор по типу результата и граничным значениям.
ABS
ABS возвращает модуль числа, то есть его расстояние или величину отклонения без знака. Вызывать функцию можно в выражении консольной или графической программы; оператор SCREEN или CANVAS не требуется.
Синтаксис
ABS(<значение>)
Аргументы
Аргумент должен быть числом типа INTEGER, LONG, DOUBLE или DECIMAL. Передайте выражение, над которым нужно выполнить указанное вычисление.
Результат
Тип результата совпадает с типом аргумента.
Правила и ограничения
Ноль остаётся нулём. Минимальные INTEGER и LONG не имеют положительного аналога в своём типе.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента. MB3008 возникает при переполнении модуля минимального INTEGER или LONG.
Пример
PRINT ABS(-18)
PRINT ABS(0)Ожидаемый вывод:
18
0
См. также
SGN
Функция SGN возвращает знак числа в виде −1, 0 или 1, что позволяет определить направление изменения числа по его знаку. Вызов допустим в выражении консольной и графической программы, оператор SCREEN или CANVAS не нужен.
Синтаксис
SGN(<значение>)
Аргументы
Аргумент должен быть числом типа INTEGER, LONG, DOUBLE или DECIMAL. Передайте выражение, над которым нужно выполнить указанное вычисление.
Результат
Результат INTEGER: −1 для отрицательного числа, 0 для нуля, 1 для положительного.
Правила и ограничения
Положительный и отрицательный ноль DOUBLE дают 0.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента.
Пример
PRINT SGN(-9)
PRINT SGN(0)
PRINT SGN(9)Ожидаемый вывод:
-1
0
1
См. также
MIN
MIN возвращает меньшее из двух чисел, поэтому выбрать меньшее число можно непосредственно в выражении. Функция работает в выражениях консольных и графических программ, оператор SCREEN или CANVAS не требуется.
Синтаксис
MIN(<первое число>, <второе число>)
Аргументы
Передайте два числовых выражения; первое и второе задают сравниваемые величины.
Результат
Результат имеет общий числовой тип аргументов.
Правила и ограничения
Аргументы приводятся к общему числовому типу до сравнения; смешение DECIMAL и DOUBLE в одном вызове отклоняется компилятором; при равенстве выбирается первый.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента.
Пример
PRINT MIN(8, 3)
PRINT MIN(2.5, 7)Ожидаемый вывод:
3
2.5
См. также
MAX
Функция MAX возвращает большее из двух чисел и позволяет выбрать его непосредственно в выражении. Вызывается она в выражениях консольных и графических программ; оператор SCREEN или CANVAS не требуется.
Синтаксис
MAX(<первое число>, <второе число>)
Аргументы
Передайте два числовых выражения; первое и второе задают сравниваемые величины.
Результат
Результат имеет общий числовой тип аргументов.
Правила и ограничения
Аргументы приводятся к общему числовому типу до сравнения; смешение DECIMAL и DOUBLE в одном вызове отклоняется компилятором; при равенстве выбирается первый.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента.
Пример
PRINT MAX(8, 3)
PRINT MAX(2.5, 7)Ожидаемый вывод:
8
7
См. также
CLAMP
CLAMP возвращает число, ограниченное заданным включительным диапазоном. Так ограничивают громкость, координату или другое числовое значение допустимым диапазоном. Вызывать функцию можно в выражении консольной или графической программы — оператор SCREEN или CANVAS не нужен.
Синтаксис
CLAMP(<значение>, <нижняя граница>, <верхняя граница>)
Аргументы
Все три аргумента числовые. Значение задаёт ограничиваемое число; нижняя и верхняя границы задают допустимый диапазон.
Результат
Ниже диапазона возвращается нижняя граница, выше — верхняя; внутри диапазона возвращается исходное значение. Тип — общий числовой тип трёх аргументов.
Правила и ограничения
Границы включены. Равные границы допустимы. Смешение DECIMAL и DOUBLE среди аргументов одного вызова отклоняется компилятором.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента. MB3007 возникает, если нижняя граница больше верхней.
Пример
PRINT CLAMP(-5, 0, 100)
PRINT CLAMP(45, 0, 100)
PRINT CLAMP(120, 0, 100)Ожидаемый вывод:
0
45
100
См. также
SETSIGN
SETSIGN возвращает модуль первого числа со знаком второго числа, объединяя отдельно вычисленные величину и направление. Вызов допустим в выражении консольной и графической программы; оператор SCREEN или CANVAS не требуется.
Синтаксис
SETSIGN(<значение>, <источник знака>)
Аргументы
Оба аргумента числовые. Значение определяет модуль и тип результата; источник знака определяет только знак.
Результат
Тип результата совпадает с типом первого аргумента.
Правила и ограничения
Для DOUBLE учитывается знак отрицательного нуля; SGN этого различия не делает.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента. MB3008 возникает, если изменение знака минимального INTEGER или LONG требует непредставимого положительного значения.
Пример
PRINT SETSIGN(12, -5)
PRINT SETSIGN(-12, 5)
PRINT SETSIGN(3, -0.0)Ожидаемый вывод:
-12
12
-3
См. также
RND
RND возвращает очередное псевдослучайное число и служит для получения случайных исходов; начальное состояние генератора задаёт оператор RANDOMIZE. Вызывается функция в выражениях консольных и графических программ, оператор SCREEN или CANVAS не требуется.
Синтаксис
RND()
Аргументы
Аргументов нет.
Результат
Результат DOUBLE находится в полуинтервале [0, 1): ноль допустим, единица исключена.
Правила и ограничения
Каждый вызов продвигает состояние генератора. Одинаковое зерно RANDOMIZE воспроизводит последовательность на той же среде исполнения. При масштабировании диапазона учитывайте точность DOUBLE и переполнение промежуточной ширины. INT возвращает INTEGER, даже если ширина вычислена как LONG.
Диагностика
Компилятор отклоняет неверное количество аргументов и несовместимый тип аргумента.
Пример
RANDOMIZE 42
DIM first AS DOUBLE = RND()
RANDOMIZE 42
PRINT RND() = first
PRINT first >= 0 AND first < 1Ожидаемый вывод:
TRUE
TRUE