Я разрабатываю критический по времени алгоритм в Java и поэтому не использую BigDecimal
. Чтобы обрабатывать ошибки округления, я вместо этого устанавливаю верхнюю границу ошибки, ниже которой разные числа с плавающей запятой считаются одинаковыми. Теперь проблема в том, что должно быть связано? Или, другими словами, какова самая большая возможная ошибка округления, которая может возникнуть при выполнении вычислительных операций с числами с плавающей запятой (сложение с плавающей запятой, вычитание, умножение и деление)?Самая большая ошибка округления при вычислении чисел с плавающей запятой
С экспериментом, который я сделал, кажется, что достаточно 1e-11
.
PS: Эта проблема не зависит от языка.
EDIT: Я использую double
тип данных. Числа генерируются с помощью метода .
EDIT 2: Кажется, мне нужно вычислить ошибку, основанную на том, как генерируются числа с плавающей запятой, которые я использую. Метод nextDouble()
выглядит следующим образом:
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27))
/(double)(1L << 53); }
на основе констант в этом методе, я должен быть в состоянии вычислить наибольшую возможную ошибку, которая может возникнуть для числа с плавающей точкой, генерируемое этим методом конкретно (его машины эпсилона?). Был бы рад, если бы кто-то мог опубликовать расчет.
Каков диапазон значений ваших номеров? –
Имеет ли это значение? Разве это не единственное, что имеет значение для десятичной части, которая не имеет значения, насколько велики числа? Но чтобы ответить вам, это может быть разным на основе ввода. Диапазон может быть [0-100] или [0-10000]. – user2340939
https://en.wikipedia.org/wiki/Machine_epsilon Машина Эпсилон - технический термин, который вы ищете; на странице Википедии также обсуждаются некоторые способы расчета машинного эпсилона. Не уверен, что это то, что вы ищете. – lmcphers