实际的最低可能的正实数是多少


11

MSDN表示,实数的范围是-3.40E + 38至-1.18E-38、0和1.18E-38至3.40E +38。显然,实际下限要低得多。以下脚本使用1.401298E-45填充REAL列:

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

谁能告诉我实际的最低可能的正数是多少?


1
这种类型肯定有一些奇怪的行为。我能够强制转换和选择的最小标量文字是1.1754944E-38,其返回值为1.175494E-38(请注意末尾缺少的4)-如果您尝试直接强制转换1.175494E-38,您将得到零背部。
乔恩·塞格尔

Answers:


13

最小正(亚普通)单精度浮点值为2 -149≈1.4 ×10 -45。最小正法向值为2 -126≈1.18 ×10 -38参考)。

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

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

对于双精度,最小正子范数为:

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

SELECT @r1, CONVERT(binary(8), @r1);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.