Каждый общий язык (стандартный C++, scilab, matlab, ...) использует в том же формате для представления десятичных чисел. Это известно как IEEE754 и его точная документация объясняется:
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
Это означает, что точность остается постоянным почти все часто используемые системы. Это номер , близкий к 2^-52 (или, что то же самое, 2.2204e-16). Он определяет «расстояние от 1.0 до следующего наибольшего числа двойной точности».
Когда вы используете scilab, вы можете подтвердить это командой %eps
https://help.scilab.org/docs/5.5.1/fr_FR/percenteps.html. Для matlab он хранится в переменной eps
http://nl.mathworks.com/help/matlab/ref/eps.html. Для C++ это немного сложнее (см .: http://en.cppreference.com/w/cpp/types/numeric_limits/epsilon).
Итак, не беспокойтесь о точности , если вы не используете конкретную машину (атипичные архитектуры или очень старые компьютеры или высокоточные десятичные знаки (64 бит). Стандартные по умолчанию всегда будут соответствовать одному стандарту (IEEE 754).
Но, не забывайте, даже если он кажется постоянным, что ошибка может быть неодинаковой между очень большими числами и очень малой (система рассчитана на максимальную точность для интервала [0, 1 [и для интервала [1, MAXIMUM [)).
Это может быть показано в следующем примере:
>>> 1e100 == 1e100+1
True
>>> 1 == 2
False
Чтобы убедиться, что ваш код переносит на разных языках, я предлагаю вам явно относится к функциям, которые дают точность станка. Например, в scipy: print(np.finfo(float).eps)
. Но, как правило, хорошо спроектированные алгоритмы не будут сильно отличаться на машине с несколько разными эпсилонцами.
Например, если я реализую петлю для чего-то, что имеет тенденцию будет быть 0 (asymptoticly), в MATLAB, я должен написать:
while(val < eps) do
...
end
Итак, главный совет должен быть: не постройте алгоритм, который будет пытаться использовать слишком много информации с аппарата. Либо вы можете использовать реальное значение epsilon, либо вы можете жестко закодировать что-то вроде 2e-15. Он будет работать на множестве разных машин.
Это не совсем корректную оценить плавающей точечной ошибки в «десятичных разрядах». Что относительно 1.999999999999999999999999999 и 2.0? Они различаются во всех десятичных знаках. Ошибка зависит от * целого * числа не только десятичной части. – Suever
@Suever Это хороший момент. Как вы оцениваете их? –
Это действительно зависит от того, что вы пытаетесь сделать. Вы пытаетесь определить правильный тип данных для использования? – Suever