Difference between revisions of "Числа"

From SunFlurry wiki
Jump to: navigation, search
m (1 revision imported)
1>Admin
Line 6: Line 6:
 
* Целые числа используются для счетчиков циклов, индексов и размеров списков и таблиц и для любых других целей, где использование перечислимых значений более оправдано, чем использование вещественных. Целое число в системе может принимать диапазон значений от −9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, оно представлено 64 битами и является аналогом Int64 в других системах программирования. Нужно заменить, что, для индексации списков и таблиц в системе, как и для многих других внутренних индексов и значений, используются только 32 битные целые числа (Int32).
 
* Целые числа используются для счетчиков циклов, индексов и размеров списков и таблиц и для любых других целей, где использование перечислимых значений более оправдано, чем использование вещественных. Целое число в системе может принимать диапазон значений от −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 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]]'''. Если не соблюдать правил округления перед сравнением, можно получить ошибки логики, возникающие на непостоянной основе.</p>
+
** '''Важно.''' При работе с вещественными x87 числами необходимо понимать, что многие десятичные числа не могут быть точно представлены в двоичной логике. Это значит, что десятичное число 0.1 невозможно точно записать в бинарной нотации, так же, как, к примеру невозможно точно записать в десятичной нотации число, получающееся в результате вычисления 1/3 (0.33333333...). Такие числа будут записаны в памяти только ''примерно'' с некоторой степенью приближения. При работе с вещественными числами часто возникают ситуации, когда происходит большое количество сложений (сумма) или сложений с делениями, в этом случае, неточности представления каждого из чисел будут накапливаться и результат может содержать небольшую погрешность. Поэтому при сравнении двух вещественных чисел в системе, особенно, если хотя бы одно из них было получено в результате вычислений, нужно понимать, что эти числа могут отличаться (к примеру, число '''0.1''' полученное из запроса к данным БД и '''0.1''', получившееся в результате вычисления, могут отличаться на цифру в последнем разряде точности). Нужно однако заметить, что по умолчанию, при сравнении система производит особое (граничное) округление вещественных чисел, чтобы избежать большинство ошибок логики, которые иначе могут возникать на непостоянной основе. Таким образом, число, близкое к определенному знаку после точки, при сравнении будет выступать, как округленное до этого знака число. К примеру, число <code>0.1+1E-14</code> при сравнении будет просто числом ''0.1''. Любые вычисления, однако, будут использовать точное представление числа. Если необходимо проводить математически точное сравнение вещественных чисел, можно использовать функцию [[PreciseCompare]] и выводить их на экран с помощью функции [[NumberToStr]].
 +
** Также нужно обратить внимание на возможное накапливание неточности при сложении большого числа вещественных чисел с известной точностью (к примеру, денежных номинаций, см., к примеру, описание функции [[Tab.Sum]]), так как операции над числами всегда происходят с максимальной точностью. Чтобы избежать этого, можно использовать функцию [[Round]] после каждого сложения.</p>
 
<p>Превращение из целых чисел в вещественные происходит в системе автоматически. Если, к примеру, разделить целое число 2 на целое число 1, получится вещественное число 2. Обратное превращение происходит с использованием специальных функций (''Round'', ''Trunc'' и пр.).</p>
 
<p>Превращение из целых чисел в вещественные происходит в системе автоматически. Если, к примеру, разделить целое число 2 на целое число 1, получится вещественное число 2. Обратное превращение происходит с использованием специальных функций (''Round'', ''Trunc'' и пр.).</p>
 
Ниже даны функции, помогающие при работе с числами:
 
Ниже даны функции, помогающие при работе с числами:
Line 13: Line 14:
 
* Функции, превращающие строку в число: '''[[Number]]''', '''[[BaseToDec]]'''
 
* Функции, превращающие строку в число: '''[[Number]]''', '''[[BaseToDec]]'''
 
* Функции округления и усечения дробной части вещественных чисел: '''[[Round]]''', '''[[Trunc]]''', '''[[Floor]]''', '''[[Ceiling]]''', '''[[Frac]]'''
 
* Функции округления и усечения дробной части вещественных чисел: '''[[Round]]''', '''[[Trunc]]''', '''[[Floor]]''', '''[[Ceiling]]''', '''[[Frac]]'''
* Функции работы со знаками чисел: '''[[Abs]]''', '''[[Sign]]'''
+
* Функции работы со знаками чисел: '''[[Abs]]''', '''[[Sign]]''', '''[[PreciseSign]]''', '''[[PreciseCompare]]'''

Revision as of 08:54, 23 December 2021

Для оптимизации при вычислениях и обмене с внешними источниками данных, система использует числа двух форматов: целые (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 и пр.).

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