Vraag Verschil tussen Double.MIN_NORMAL en Double.MIN_VALUE?


Mag ik weten wat het verschil is Double.MIN_NORMAL (geïntroduceerd in 1.6) en Double.MIN_VALUE?

JavaDoc van Double.MIN_NORMAL:

Een constant bezit   de kleinste positieve normale waarde van   type double, 2-1022

JavaDoc van Double.MIN_VALUE:

Een constant bezit   de kleinste positieve niet-nulwaarde van   type double, 2-1074


39
2017-09-16 15:42


oorsprong


antwoorden:


Het antwoord is te vinden in de IEEE-specificatie van drijvende-kommaweergave:

Voor het enkelvoudige formaat is het verschil tussen een normaal getal en een subnormaal getal dat het leidende bit van de significand (het bit naar links van het binaire punt) van een normaal getal 1 is, terwijl het voorloopbit van de significantie van een subnormaal getal getal is 0. Single-format subnormale nummers werden single-format denormalized numbers genoemd in IEEE Standard 754.

Met andere woorden, Double.MIN_NORMAL is het kleinst mogelijke aantal dat u kunt weergeven, op voorwaarde dat u een 1 voor het binaire punt hebt (wat decimale punt in een decimaal systeem wordt genoemd). Terwijl Double.MIN_VALUE is in feite het kleinste getal dat je kunt vertegenwoordigen zonder deze beperking.


24
2017-09-16 15:46



TLDR:

Double.MIN_NORMAL geeft het kleinste positief IEEE-754 binary64 "normaal nummer"(ook bekend als genormaliseerde nummers). Dit staat voor 2-1022, dat is ongeveer 2.225 × 10-308.

Double.MIN_VALUE geeft de kleinste positieve IEEE-754 binaire64 "subnormaal getal"(ook bekend als gedenormaliseerde of subnormale getallen.) Dit staat voor 2-1074, dat is ongeveer 4.94 × 10-324. (Dit is ook het nummer gegeven door .NET's Double.Epsilon.)

TSDR:

Om te begrijpen waarom deze getallen zijn wat ze zijn en wat het verschil is, moeten we dieper kijken. (Lees ook het antwoord van Bosonix.)

Overweeg de bitrepresentatie van een IEEE-754 binary64-indeling:

s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm

IEEE-754 binaire64-waarden zijn als volgt afgeleid:

  • Als e is meer dan 0 en minder dan 2047 (2047 is 111_1111_1111 in binair),

    dan is waarde gelijk aan (-1)s × 2e-1023 × (1 + m × 2-52). (Dit zijn de normale nummers.)

  • Als e is gelijk aan 0,

    dan is de waarde gelijk aan (-1)s × 2(E + 1) -1023 × (0 + m × 2-52). (Naast nul zijn dit de subnormale getallen.)

  • Als e is gelijk aan 2047 en m is gelijk aan 0,

    dan is de waarde gelijk aan (-1)s × oneindigheid.

  • Als e is gelijk aan 2047 en m niet gelijk aan 0,

    dan is de waarde gelijk aan NaN. (Niet-gerelateerd feit: dus is er 2 × (252 - 1) verschillende bitrepresentaties voor NaN; cf. doubleToRawLongBits.)

Daarom is het kleinste positieve IEEE-754 binaire64 normale aantal gelijk aan:

(-1)0 × 21-1023 × (1 + 0 × 2-52)

= 2-1022

En het kleinste positieve IEEE-754 binaire64 subnormale getal is gelijk aan:

(-1)0 × 2(0 + 1) -1023 × (0 + 1 × 2-52)

= 2-1022 × 2-52

= 2-1074


12
2017-08-22 01:01



Voor de eenvoud zal de uitleg alleen de positieve cijfers bevatten.

De maximale afstand tussen twee aangrenzende genormaliseerde drijvende-kommawaarden 'x1' en 'x2' is 2 * epsilon * x1 (de genormaliseerde drijvende-kommawaarden zijn niet gelijk verdeeld, ze zijn logaritmisch uit elkaar geplaatst). Dat betekent dat wanneer a echt nummer (d.w.z. het "wiskundige" getal) is afgerond op een drijvend kommagetal, het maximum relatieve fout is epsilon, wat een constante is die machine epsilon of eenheid roundoffen voor dubbele precisie heeft het de waarde 2 ^ -52 (geschatte waarde 2.22e-16).

Het drijvende-kommagetal kleiner dan Double.MIN_NORMAL worden subnormen genoemd en vullen gelijkmatig het gat tussen 0 en Double.MIN_NORMAL. Dat betekent dat de berekeningen met subnormen kunnen leiden tot minder nauwkeurige resultaten. Door gebruik te maken van subnormen kan een berekening langzamer achteruit gaan als het resultaat klein is.


2
2018-04-06 11:23