Числа

From SunFlurry wiki
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, получившееся в результате вычисления, могут отличаться на цифру в последнем разряде точности). Нужно однако заметить, что по умолчанию, при сравнении система производит особое (граничное) округление вещественных чисел, чтобы избежать большинство ошибок логики, которые иначе могут возникать на непостоянной основе. Таким образом, число, близкое к определенному знаку после точки, при сравнении будет выступать, как округленное до этого знака число. К примеру, число 0.1+1E-14 при сравнении будет просто числом 0.1. Любые вычисления, однако, будут использовать точное представление числа. Если необходимо проводить математически точное сравнение вещественных чисел, можно использовать функцию PreciseCompare и выводить их на экран с помощью функции NumberToStr.
    • Также нужно обратить внимание на возможное накапливание неточности при сложении большого числа вещественных чисел с известной точностью (к примеру, денежных номинаций, см., к примеру, описание функции Tab.Sum), так как операции над числами всегда происходят с максимальной точностью. Чтобы избежать этого, можно использовать функцию Round после каждого сложения.

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

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