2016-12-22 11 views
22

私はちょうどNaNの定義をDouble.classに見つけました。それは言う:0.00.0d、および0.0DDouble.NaN = 0.0d/0.0の定義に "d"があるのはなぜですか?

/** 
    * 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仕様に従ってこれらのリテラルは同じ番号を表していることを知っています。

はまた、他の定数のために、彼らは「D」接尾辞を使用していませんでした:

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

なぜ彼らがNaNの定義における0.0の最初の部分に接尾辞dを書く必要がありましたか?

これは目的または偶然によるものですか?

+6

実装者の一部で単純に防御プログラミングを行う可能性があります。 TODOやコメントアウトされたコードで判断すると、JDKはまさにプログラミングのゴールデンスタンダードではありません。 –

+10

これはまったく歴史的なアーティファクトである可能性もあります(オークの「0.0」は浮動小数点リテラルであるかもしれません)。 –

+10

@MarkRotteveelは、[このOak言語仕様のこのバージョン](http://www.eecs.harvard.edu/~waldo/oakSpec.pdf)によると、「2.0fまたは2.0Fまたは2.0float」となっています。 –

答えて

25

Oak language specによれば、浮動小数点リテラルの形式は以下の通りであった:

  • 2.0D又は2。0Dダブル
  • 2.0f又は2.0Fまたは2.0フロート

が、これは、それが接尾されている場合リテラル浮動小数点型フロートのあるJava version 1.0

により馴染みのJava方法に変更ASCII文字のFまたはf;それ以外の場合はその型はdoubleで、オプションでASCII文字のDまたはdを付けることができます。

C-like languagesと一致するように変更された可能性があります。接尾辞の欠如は2重を意味します。

したがって、dは歴史的遺物であると思われます。リンクされたOak仕様(「予備」)には、NaNがまだ実装されていないというマージンノートがあります。おそらくそれはわずかに後のバージョンで実装され、永遠に変わっていません。

(オーク言語仕様を調べるためのナッジのためのProps to Mark Rotteveel)。

+7

次回は自分でGoogleを使用する必要があることを伝えてください;) –

6

0.00.0dの間に違いはありません。なぜなら、Javaはデフォルトで浮動小数点数を表すために倍精度を取ります。

それでも、コードがfloatは同様にそれがOakの後半で、それは歴史的な問題のように見えるように、Javaのになるために進化したように、デフォルトで、多くの言語のように、より読みやすいです。

--Link Andy Turnerが見つかりました。

8

言語仕様によれば、0.00.0d

JLS Section 3.10.2次のようにこれを説明と同じである:それは ASCII文字接尾辞いる場合

浮動小数点リテラルはfloat型でありますFまたはf;そうでなければ、その種類は二重であり、これは 随意ASCII文字DまたはD浮動小数点リテラル数を作製する方法の

つ接尾辞することができ、使用することです「」その数に

なぜ作者がd接尾辞を使用するのかはわかりません。しかし、これは、このコードを理解する際に、読者が必要とする努力の量を減らすために、しばしば明快さを加えることです。ルールは一部の人には知られているかもしれないが、誰にも知られていないかもしれない。デフォルトは、他の言語でも異なる場合があります。したがって、多くの場合、より冗長なバージョンを書くほうが優れています。 (すべてのプログラマは、彼らが同じである知っている場合でも)、読みやすくているので、私は、括弧を持つものを好む

double a = b + c * d; 

double a = b + (c * d); 

VS:

本の別の例は、括弧です。