Java двойной Эпсилон

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

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

Почему нет EPSILON?

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

Есть ли какие-либо различия в std::numeric_limits< double >::epsilon()?

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

4 ответов


Я предполагаю, что вы имеете в виду Эпсилон в смысле ошибки в значении. И. Е этой.

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

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

EDIT: по определению ОП Эпсилон теперь в вопросе, ULP двойника значения 1.0 является 2.220446049250313 E-16 выражается как двойной. (Т. е. возвращаемое значение Math.ulp(1.0).)


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

Double.longBitsToDouble(971l << 52)        

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

Это немного быстрее, чем математику.ulp (1.0);

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


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

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

глядя на стандарте IEEE 754 вы найдете точностью epsion...

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

binary64:

  • Base (b)=2
  • точность (p)=53
  • machineEpsion (e) (b^ - (p-1))/2=2^-53=1.11 e-16
  • machineEpsilon(e) b^ - (p-1)=2^-52=2,22 e-16

путем редактирования вопроса, объясняя, что подразумевается под 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, но он имеет другое значение, а именно то, которое покрыто константой DBL_MIN и на Java by Double.MIN_VALUE. Конечно, ситуация, которая может привести к некоторой путанице, поскольку она делает термин EPSILON неоднозначное.