Недопустимая ошибка операции с плавающей запятой при подсчете логарифма в SQL Server 2008 - PullRequest
8 голосов
/ 26 мая 2011

В Microsoft SQL Server 2008 у меня есть таблица, скажем myTable, содержащая около 600 тыс. Строк (на самом деле, это результат объединения нескольких других таблиц, но я полагаю, что это не важно).Один из столбцов, скажем, value, имеет тип numeric (6,2).

Простой запрос SELECT value FROM myTable ORDER BY value возвращает, конечно, около 600 тыс. Номеров, начиная с 1,01 (то есть наименьшего) и заканчивая 70,00(наибольший);нет NULL с или другие значения.

Обратите внимание, что все эти значения являются числовыми и положительными.Однако при вызове SELECT LOG(value) FROM myTable я получаю сообщение об ошибке «Произошла недопустимая операция с плавающей запятой» .

Эта ошибка всегда появляется примерно через 3 минуты после выполнения запроса.При копировании 600k-значений в Excel и подсчете их LN () проблем абсолютно не возникает.

Я пытался преобразовать value в действительные или с плавающей точкой, что не помогло вообще.Наконец я нашел обходной путь: SELECT LOG(CASE WHEN value>0 THEN value ELSE 1 END) FROM myTable.Это работает.Но почему, когда все значения положительные?Я попытался взять результат и сравнить логарифмы с подсчитанными в Excel - они все одинаковые (в некоторых строках встречаются только различия порядка 10 ^ (- 15) или меньше, что почти наверняка дает разную точность),Это означает, что условие в выражении CASE всегда верно, я полагаю.

У кого-нибудь есть идеи, почему возникает эта ошибка?Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

5 голосов
/ 26 мая 2011

Вы можете определить конкретное значение, которое вызывает проблему;

declare @f numeric(6,2), @r float
begin try select
    @f = value, @r = LOG(value) 
from mytable
end try begin catch
    select error_message(),'value=',@f
end catch
3 голосов
/ 09 июля 2012

Вы получите эту ошибку - «Произошла недопустимая операция с плавающей запятой» при выполнении LOG (0). Значение LOG (ноль) в мире математики не определено, поэтому возникает ошибка.

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...