Was ist die tatsächlich niedrigstmögliche positive REAL-Zahl?

11

MSDN sagt, dass der Bereich der REAL-Zahlen - 3,40E + 38 bis -1,18E - 38, 0 und 1,18E - 38 bis 3,40E + 38 ist. Anscheinend ist die wahre Untergrenze viel niedriger. Das folgende Skript füllt eine REAL-Spalte mit 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

Kann mir jemand sagen, was die tatsächlich niedrigstmögliche positive Zahl ist?

AK
quelle
1
Es gibt definitiv ein seltsames Verhalten bei diesem Typ. Das kleinste skalare Literal, das ich wirken und auswählen konnte, war 1.1754944E-38, das als 1.175494E-38 zurückgegeben wurde (beachten Sie die fehlenden 4 am Ende). Wenn Sie versuchen, 1.175494E-38 direkt zu wirken, erhalten Sie Null zurück.
Jon Seigel

Antworten:

13

Der minimale positive (subnormale) Gleitkommawert mit einfacher Genauigkeit beträgt 2 - 149 ≈ 1,4 × 10 - 45 . Der minimale positive Normalwert beträgt 2 –126 ≈ 1,18 × 10 –38 ( Referenz ).

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

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

Bei doppelter Genauigkeit beträgt die minimale positive Subnormalität :

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

SELECT @r1, CONVERT(binary(8), @r1);
Paul White 9
quelle