SQL Server日志:";发生无效的浮点操作";-即使输入在范围内

SQL Server日志:";发生无效的浮点操作";-即使输入在范围内,sql,sql-server,Sql,Sql Server,我收到了错误信息 Msg 3623, Level 16, State 1, Line 25 An invalid floating point operation occurred. 从SQL Server 11.0.2100(在AWS RDS实例上)进行以下查询: 从MyTable中选择SUM(LOG(col+1)); col的所有值都在-0.1和0.1范围内 如果我从查询中删除总和,它将正常运行,这意味着要记录的输入是正确的: SELECT LOG(col + 1) FROM MyTab

我收到了错误信息

Msg 3623, Level 16, State 1, Line 25
An invalid floating point operation occurred.
从SQL Server 11.0.2100(在AWS RDS实例上)进行以下查询:

从MyTable中选择SUM(LOG(col+1));
col的所有值都在-0.1和0.1范围内

如果我从查询中删除总和,它将正常运行,这意味着要记录的输入是正确的:

SELECT LOG(col + 1) FROM MyTable;
另外,如果我在临时表中选择上面的值,然后对临时表中的值求和,这也很好,这意味着求和没有问题:

SELECT LOG(col + 1) thelog INTO #x FROM MyTable;
SELECT SUM(thelog) FROM #x;
DROP TABLE #x;
只有当我一起运行SUM和LOG时,我才会遇到问题

为什么会这样?SQL Server是否可能以某种方式将+1重新安排在日志之外,从而使日志输入超出范围


注意:在查询中放置col>-1时的大小写也可以修复它,但这不应该是必需的,因为col+1的所有值都在范围内。我想知道这可能是什么原因…

浮点值因舍入问题而臭名昭著,因为它们存储为二进制分数,而二进制分数通常没有精确的十进制等价物。我认为这里发生的情况是,您的一个值非常接近-1(例如-0.99999999999999),当您添加1时,它有时可能被四舍五入为0。对于输入0,日志函数未定义,因此结果是
发生了无效的浮点操作

Mytable是表还是视图?查询真的更复杂吗?只是为了好玩,如果您尝试从MyTable中选择SUM(LOG(col+1.0));请添加检查约束以确保值确实在范围内:
ALTER TABLE MyTable add constraint ck_col_in_range CHECK(col介于-0.1和0.1之间)
我模拟了此数据,无法再现您的问题。版本为11.0.3000。查询是从sys.all_列、sys.all_列a中选择SUM(LOG((CONVERT(INT,CRYPT_GEN_RANDOM(2))/65536.0*0.2-0.1+1)),这给了我超过5600万个介于-0.1和0.1(+1)之间的随机值的LOG之和。你使用的是你没有告诉我们的
WHERE
-子句吗?