Подтвердить что ты не робот

Почему в определении Double.NaN = 0.0d/0.0?

Я натолкнулся на определение NaN в Double.class. В нем говорится:

 /**
   * A constant holding a Not-a-Number (NaN) value of type
   * {@code double}. It is equivalent to the value returned by
   * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
   */
  public static final double NaN = 0.0d / 0.0;

Я знаю, что согласно спецификации Java эти литералы представляют одинаковое число: 0.0, 0.0d и 0.0d.

Также для других констант они не использовали суффикс 'd':

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

Почему им нужно было записать суффикс d в первую часть 0.0 в определении NaN?

Это было специально или случайно?

4b9b3361

Ответ 1

В соответствии с Специфика языка дуба формат литералов с плавающей запятой был:

  • 2.0d или 2.0D double
  • 2.0f или 2.0F или 2.0 float

но это изменилось на привычный Java-способ Java-версия 1.0

Литерал с плавающей запятой имеет тип float, если он суффикс с буквой ASCII F или f; в противном случае его тип двойной, и он может быть дополнительно суффикс с буквой ASCII D или d.

Возможно, было внесено изменение, чтобы оно соответствовало C-like languages ​​, где отсутствие суффикса означает double.

Итак, d представляется исторической реликвией; хотя в связанной версии Oak spec (которая является "предварительной" ) есть примечание о марже, в котором говорится, что NaN еще не реализована. Возможно, это было реализовано в чуть более поздней версии и осталось неизменным навсегда.

(Подставляет Mark Rotteveel для подталкивания, чтобы найти специфика языка Oak).

Ответ 2

Согласно спецификации языка, 0.0 совпадает с 0.0d

JLS Раздел 3.10.2 описывает это следующим образом:

Литерал с плавающей запятой имеет тип float, если он суффикс с ASCII-буква F или f; в противном случае его тип двойной, и он может необязательно быть суффиксом с буквой ASCII D или d

Один из способов создания плавающей запятой с литеральным числом - это использовать '.' в числе.

Почему авторы используют суффикс d, неизвестно. Но часто это заключается в том, чтобы добавить ясность или уменьшить объем усилий, требуемых от читателя при понимании этого кода. Правила могут быть известны некоторым людям, но не всем. Значения по умолчанию также могут отличаться для других языков. Следовательно, во многих случаях лучше писать более подробную версию.

Другим примером этого являются круглые скобки:

 double a = b + c * d;

против

 double a = b + (c * d);

Я предпочитаю одно с круглыми скобками, потому что его легче читать (даже если все программисты знают, что они равны).

Ответ 3

Нет разницы между 0.0 и 0.0d, так как Java по умолчанию удваивает, чтобы представлять числа с плавающей запятой.

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

- Ссылка, найденная Энди Тернером.