Java double epsilon

В настоящее время я нуждаюсь в epsilon типа double (предпочтительны константы в java-библиотеках вместо собственных реализаций/определения)

Насколько я вижу, double имеет MIN_VALUE и MAX_VALUE как статические члены.

Почему нет EPSILON?

Что бы epsilon<double> было?

Существуют ли какие-либо отличия от std::numeric_limits< double >::epsilon()?

Epsilon: разница между 1 и наименьшим значением больше 1, которое представляется для типа данных.

Ответ 1

Я предполагаю, что вы имеете в виду эпсилон в смысле ошибки в значении. I.e this.

Если это так, то в Java он называется ULP (единица на последнем месте). Вы можете найти его с помощью пакета java.lang.Math и метода Math.ulp(). См. javadocs здесь.

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

EDIT:. В определении OP epsilon теперь в вопросе ULP двойного значения 1.0 равен 2.220446049250313E-16, выраженному как double. (I.e. возвращаемое значение Math.ulp(1.0).)

Ответ 2

Без использования пакета Math:

Double.longBitsToDouble(971l << 52)        

Это 2 ^ -52 (971 = 1023 (смещение двойного экспоненты) - 52, сдвиг на 52 - это потому, что мантисса хранится на первых 52 бит).

Это немного быстрее, чем Math.ulp(1.0);

Кроме того, если вам нужно сравнить двойные значения, там действительно полезная статья: https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

Ответ 3

double: двойной тип данных - это 64-разрядная 64-битная плавающая точка IEEE 754 с двойной точностью. Его диапазон значений выходит за рамки этого обсуждения, но указан в разделе "Типы, форматы и значения плавающей запятой" Спецификации языка Java. Для десятичных значений этот тип данных обычно является выбором по умолчанию. Как уже упоминалось выше, этот тип данных никогда не должен использоваться для точных значений, таких как валюта.

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

глядя на IEEE 754, вы найдете точность эпсии...

http://en.wikipedia.org/wiki/IEEE_floating_point

binary64:

  • База (b) = 2
  • точность (p) = 53
  • machineEpsion (e) (b ^ - (p-1))/2 = 2 ^ -53 = 1.11e-16
  • machineEpsilon (e) b ^ - (p-1) = 2 ^ -52 = 2.22e-16

Ответ 4

Изменив вопрос, объяснив, что имеется в виду под EPSILON, вопрос теперь ясен, но может быть полезно указать следующее:

Я считаю, что исходный вопрос был вызван тем фактом, что в C есть константа DBL_EPSILON, определенная в стандартном заголовочном файле float.h, который фиксирует то, на что относится этот вопрос. Один и тот же стандартный заголовочный файл содержит определения констант DBL_MIN и DBL_MAX, которые явно соответствуют Double.MIN_VALUE и Double.MAX_VALUE, соответственно, в Java. Поэтому было бы естественно предположить, что Java, по аналогии, также должна содержать определение чего-то типа Double.EPSILON с тем же значением, что и DBL_EPSILON в C. Странно, однако, это не так. Еще более странно, что С# содержит определение Double.EPSILON, но оно имеет другое значение, а именно тот, который покрыт C константой DBL_MIN, а в Java - Double.MIN_VALUE. Конечно, ситуация, которая может привести к некоторой путанице, поскольку она делает термин EPSILON неоднозначным.