Я разрабатываю критичный ко времени алгоритм на Java и поэтому не использую BigDecimal
. Чтобы обработать ошибки округления, я вместо этого установил верхнюю границу ошибки, ниже которой разные числа с плавающей запятой считаются точно такими же. Теперь проблема в том, какой должна быть эта граница? Или, другими словами, какая самая большая ошибка округления может возникнуть при выполнении вычислительных операций с числами с плавающей запятой (сложение с плавающей запятой, вычитание, умножение и деление)?
В проведенном мною эксперименте кажется, что ограничения 1e-11
достаточно.
PS: Эта проблема не зависит от языка.
РЕДАКТИРОВАТЬ: я использую тип данных double
. Числа генерируются методом nextDouble()
Random
.
РЕДАКТИРОВАТЬ 2: Кажется, мне нужно вычислить ошибку на основе того, как генерируются числа с плавающей запятой, которые я использую. Метод nextDouble()
выглядит так:
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27))
/ (double)(1L << 53); }
Основываясь на константах в этом методе, я должен быть в состоянии вычислить наибольшую возможную ошибку, которая может возникнуть для числа с плавающей запятой, сгенерированного специально этим методом (его машинный эпсилон?). Был бы рад, если бы кто-нибудь выложил расчет.
double
, ваша абсолютная ошибка для одной операции может быть порядка 10 ^ 292. - person Louis Wasserman   schedule 17.06.2015