Я работаю над каким-то инструментом, который вычисляет числа, которые в худшем случае могут приблизиться к 1e-25
, и сравниваю их вместе на Java. Я, очевидно, использую двойную точность.
Я прочитал в другом ответе, что я не должен ожидать большей точности, чем от 1e-15
до 1e-17
, и этот другой вопрос касается повышения точности при упорядочении операций в "лучшем" порядке.
Какие операции с двойной точностью более склонны к потере точности по пути? Должен ли я пытаться работать с числом как можно большим или как можно меньшим? Делать сначала деление перед умножением?
Я бы предпочел не использовать BigDecimal
классы или эквивалент, так как код уже достаточно медленный;) (если, конечно, они не слишком сильно влияют на скорость).
Любая информация будет принята с благодарностью!
EDIT: Тот факт, что числа "маленькие" по абсолютной величине (1e-25), не имеет значения, так как значение double может опускаться до 1e-324. Но важно то, что когда они очень похожи (оба в 1e-25), мне приходится сравнивать, скажем, 4,64563824048517606458e-21 с 4,64563824048517606472e-21 (разница в 19-й и 20-й цифрах). При вычислении этих чисел разница настолько мала, что я могу столкнуться с "ошибкой округления", когда остаток заполняется случайными числами.
Возникает вопрос: «Как упорядочить вычисления, чтобы свести к минимуму эту потерю точности?». Это может быть деление перед умножением или сначала сложение.