Числа

From SunFlurry wiki
Revision as of 08:56, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
Jump to: navigation, search

Для оптимизации при вычислениях и обмене с внешними источниками данных, система использует числа двух форматов: целые (Integer) и вещественные (Real). Для разделителя целой и дробной части в вещественных числах система всегда (вне зависимости от установок операционной системы) использует десятичную точку (.), а не запятую. Если необходимо, при обмене с внешними источниками данных, указать запятую, как разделитель, программа должна предусмотреть подмену знаков в момент выгрузки числовых значений.

  • Целые числа используются для счетчиков циклов, индексов и размеров списков и таблиц и для любых других целей, где использование перечислимых значений более оправдано, чем использование вещественных. Целое число в системе может принимать диапазон значений от −9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, оно представлено 64 битами и является аналогом Int64 в других системах программирования. Нужно заменить, что, для индексации списков и таблиц в системе, как и для многих других внутренних индексов и значений, используются только 32 битные целые числа (Int32).
  • Вещественные числа являются более универсальным способом сохранять числовые данные. По умолчанию в системе используются x87 Extended числа. Каждое такое число представлено 80 битами в памяти и может содержать до 18 значащих цифр в мантиссе с диапазоном значений от -1.189731495357231765E+4932 до 1.189731495357231765E+4932 и может приближаться к нулю до значений (+/-)3.36210314311209351E-4932. При необходимости, система может быть перестроена (скомпилирована заново) для возможности работы вещественными числами очень большого разрешения (библиотеками MPIR и пр.), такой подход требуется в очень редких случаях и может замедлить работу системы при вычислениях с плавающей точкой.
    • Важно. При работе с вещественными x87 числами необходимо понимать, что многие десятичные числа не могут быть точно представлены в двоичной логике. Это значит, что десятичное число 0.1 невозможно точно записать в бинарной нотации, так же, как, к примеру невозможно точно записать в десятичной нотации число, получающееся в результате вычисления 1/3 (0.33333333...). Такие числа будут записаны в памяти только примерно с некоторой степенью приближения. При работе с вещественными числами часто возникают ситуации, когда происходит большое количество сложений (сумма) или сложений с делениями, в этом случае, неточности представления каждого из чисел будут накапливаться и результат может содержать небольшую погрешность. Поэтому нельзя сравнивать два вещественных числа в системе, особенно, если хотя бы одно из них было получено в результате вычислений, без использования округлений до определенного знака. Число 0.1 полученное из запроса к данным БД и 0.1, получившееся в результате вычисления, могут отличаться на цифру в последнем разряде точности, поэтому при проверке равно ли значение из БД вычисленному, необходимо всегда знать, с какой точностью производить проверку (к примеру, для денежным значений, точность будет равна двум знакам после десятичной точки). Для округления до определенного знака используется функция Round. Если не соблюдать правил округления перед сравнением, можно получить ошибки логики, возникающие на непостоянной основе.

Превращение из целых чисел в вещественные происходит в системе автоматически. Если, к примеру, разделить целое число 2 на целое число 1, получится вещественное число 2. Обратное превращение происходит с использованием специальных функций (Round, Trunc и пр.).

Ниже даны функции, помогающие при работе с числами: