2017-09-22 19 views
8

I wzrok wykonania Double.isFinite() który istnieje od Java 8 (bo potrzebne funkcje w Java 7):Szczegóły implementacji Double.isFinite - dlaczego DoubleConsts.MAX_VALUE zamiast Double.MAX_VALUE?

public static boolean isFinite(double d) { 
    return Math.abs(d) <= DoubleConsts.MAX_VALUE; 
} 

gdzie DoubleConsts.MAX_VALUE jest double sun.misc.DoubleConsts.MAX_VALUE wartością 1.7976931348623157E308. To wydaje się być równoważne Double.MAX_VALUE, który jest zdefiniowany jako:

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308 

Dlaczego ta implementacja używać stałą z sun.misc -package zamiast Double.MAX_VALUE?

(Float.isFinite wykorzystuje ten sam wzorzec)

+0

dobry pytanie, zrozumiałbym, gdyby to zdefiniowało jako "publiczny statyczny ostateczny podwójny MAX_VALUE = DoubleConsts.MAX_VALUE"; aby wszystkie stałe były w jednym miejscu, ale to ... – Eugene

+0

Co ciekawe, [ten link] (https://alvinalexander.com/java/jwarehouse/openjdk-8/jdk/src/share/classes/sun/ misc/DoubleConsts.java.shtml) pokazuje, że 'DoubleConsts.MAX_VALUE' jest zdefiniowany bezpośrednio jako' java.lang.Double.MAX_VALUE'. Może ten, kto napisał tę funkcję, po prostu wyszukał coś i znalazł najpierw "DoubleConsts.MAX_VALUE"? – TripeHound

+0

Przypadek "MIN_NORMAL" jest mi jeszcze obcy - 'Double' i' DoubleConsts' zawierają * różne * dosłowne reprezentacje dla tej wartości. – Hulk

Odpowiedz

1

Przyczyną wydaje się być głównie historycznego pierwsza:

The funtionality przewidzianej za pomocą tych metod znajduje się w uprzednio sun.misc.FpUtils. Klasa ta nie jest bezpośrednio uzależnione od Double, to tylko importuje

import sun.misc.FloatConsts; 
import sun.misc.DoubleConsts; 

więc realizacja wykonana tam więcej sensu - wydaje się, że to był dokładnie taki sam:

public static boolean isFinite(double d) { 
    return Math.abs(d) <= DoubleConsts.MAX_VALUE; 
} 

Zobacz także The ticket that led to moving this to Double

+0

jeśli tak, to prawdopodobnie musielibyśmy zostać zgłoszeni - drobna poprawka, chyba – Eugene