Qual è il numero REALE positivo possibile più basso possibile


11

MSDN afferma che l'intervallo dei numeri REALI è compreso tra - 3,40 E + 38 e -1,18 E - 38, 0 e 1,18 E - 38 e 3,40 E + 38. Apparentemente il vero limite inferiore è molto più basso. Il seguente script popola una colonna REAL con 1.401298E-45:

CREATE TABLE a
  (
    r1 REAL NULL ,
    r2 REAL NULL ,
    r3 REAL NULL
  ) ;
GO
INSERT  INTO a
        ( r1, r2 )
VALUES  ( 1.18E-37, 10 ) ;
GO
DECLARE @i INT ;
SET @i = 1 ;

WHILE @i < 20 
  BEGIN ;

    UPDATE  a
    SET     r1 = r1 / r2 ;

    SELECT  r1 ,
            r2
    FROM    a ;

    SET @i = @i + 1 ;

  END ;
GO
DROP TABLE a ;

r1            r2
------------- -------------
1.18E-38      10

(snip)

r1            r2
------------- -------------
1.401298E-45  10

Qualcuno può dirmi qual è il numero positivo più basso possibile attuale?


1
C'è sicuramente un comportamento strano con questo tipo. Il più piccolo letterale scalare che sono stato in grado di lanciare e selezionare era 1.1754944E-38, che è tornato come 1.175494E-38 (notare i 4 mancanti alla fine) - se si tenta di lanciare direttamente 1.175494E-38, si ottiene zero indietro.
Jon Seigel,

Risposte:


13

Il valore minimo positivo (subnormale) in virgola mobile a precisione singola è 2 −149 ≈ 1,4 × 10 −45 . Il valore normale positivo minimo è 2 −126 ≈ 1,18 × 10 −38 ( riferimento ).

DECLARE
    @r1 real = POWER(2e0, -126),
    @r2 real = POWER(2e0, -23)

SELECT
    @r1,
    @r2,
    @r1 * @r2,
    CONVERT(binary(4), @r1 * @r2);

Per la doppia precisione, il subnormale positivo minimo è:

DECLARE @r1 float = POWER(2e0, -1075);

SELECT @r1, CONVERT(binary(8), @r1);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.