REAL столбец, содержащий значения вне задокументированного диапазона

Согласно MSDN , диапазон значений REAL составляет от -3,40E + 38 до -1,18E -38, 0 и 1,18E -38 до 3,40E + 38. Однако У меня есть довольно много значений за пределами этого диапазона в моей таблице.

Следующий запрос возвращает много очень маленьких значений и не возвращает очень больших:

SELECT  MyColumn,
        *
FROM    data.MyTable
WHERE   MyColumn <> 0
        AND ( MyColumn < CONVERT(REAL, 1.18E-38)
              OR MyColumn > CONVERT(REAL, 3.40E+38)
            )
        AND ( MyColumn < CONVERT(REAL, -3.40E+38)
              OR MyColumn > CONVERT(REAL, -1.18E-38)
            ) 

Легко показать, как эти значения попадают в таблицу. Я не могу вставить их напрямую:

CREATE TABLE a(r REAL NULL);
GO
INSERT INTO a(r) VALUES(4.330473E-39);
GO
SELECT r FROM a
GO
DROP TABLE a;

----
0.0

Но я могу разделить два столбца и получить значение вне диапазона:

CREATE TABLE a
  (
    r1 REAL NULL,
    r2 REAL NULL,
    r3 REAL NULL
  ) ;
GO
INSERT  INTO a
        ( r1, r2 )
VALUES  ( 4.330473E-38, 1000 ) ;
GO
UPDATE  a
SET     r3 = r1 / r2 ;
SELECT  r1,
        r2,
        r3
FROM    a

r1            r2            r3
------------- ------------- -------------
4.330473E-38  1000          4.330433E-41

Итак, я предполагаю, что MSDN дает неверные диапазоны действительных данных, верно? Я что-то упустил?

Несколько человек предположили, что это ошибка.

Какая именно часть этого поведения является ошибкой. это:

  1. Неправильные константы, задокументированные в MSDN и используемые в DBCC, а также неверный порог для округления в меньшую сторону.
  2. Обновление, позволяющее сохранять неверные значения

5
задан A-K 2 July 2012 в 18:17
поделиться