Как получить размер ошибки с плавающей запятой при конкретном значении в Java? - PullRequest
0 голосов
/ 12 января 2019

Существуют ли какие-либо встроенные функции Java или лучшие решения для поиска ошибки с плавающей запятой? Или, другими словами, есть ли способ найти наименьшее значение, которое я могу добавить к переменной double, которой нельзя пренебречь из-за округления с плавающей запятой?

Прямо сейчас я решил, что хороший способ получить это - перевернуть последний бит в нем, вычесть его из переменной и вернуть результат как double.

double getFloatPointError(double in){
  long bits = Double.doubleToLongBits(in);
  bits^=1;
  return Math.abs(in-Double.longBitsToDouble(bits));
}

Я не думаю, что это хорошее решение, так как сам результат вывода double, и, следовательно, также склонен к ошибкам с плавающей запятой и может дать неправильный результат. Кроме того, я, вероятно, изобретаю колесо с таким подходом, чего я бы хотел избежать.

Пояснение: Я знаю, что такое значения с плавающей запятой, я знаю, что их не следует использовать, когда важна точность, и я знаю, что для таких целей я должен использовать BigDecimal вместо этого. Пожалуйста, воздержитесь от публикации общей информации и рекомендаций, связанных с плавающей точкой, так как они вряд ли содержат ответ на мой вопрос.

1 Ответ

0 голосов
/ 12 января 2019

Я думаю, что вы ищете Math.ulp:

https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#ulp(double)

...