Sql server 2008 发生无效的浮点操作
我有一个SQL查询的问题,我已经把它缩小到以下代码Sql server 2008 发生无效的浮点操作,sql-server-2008,Sql Server 2008,我有一个SQL查询的问题,我已经把它缩小到以下代码 SELECT ACOS( (SIN(PI()* 52.9519918465976/180)*SIN(PI()* 52.9519918465976/180))+(COS(PI()* 52.9519918465976/180)*cos(PI()* 52.9519918465976/180)*COS(PI()* -1.14304013581239/180-PI()* -1.14304013581239/180))) AS test 我收到以下错
SELECT ACOS( (SIN(PI()* 52.9519918465976/180)*SIN(PI()* 52.9519918465976/180))+(COS(PI()* 52.9519918465976/180)*cos(PI()* 52.9519918465976/180)*COS(PI()* -1.14304013581239/180-PI()* -1.14304013581239/180))) AS test
我收到以下错误消息“发生了无效的浮点操作”
艾博迪能看出问题所在吗
提前感谢您在ACOS()
中的结果大于1
,这是不可能的
这是因为浮点不准确。例如,它可以是1.00000001
。将其放在1
下方一点,其工作原理如下:
SELECT ACOS(
(SIN(PI()* 52.9519918465976/180.0)* SIN(PI()* 52.9519918465976/180.0))
+ (COS(PI()* 52.9519918465976/180)*cos(PI()* 52.9519918465976/180.0)*COS(PI()* -1.14304013581239/180.0-PI()* -1.14304013581239/180.0))
- 0.0000001
)
SELECT ACOS(
(SELECT MIN(x) FROM (VALUES (
(SIN(PI()* 52.9519918465976/180.0)* SIN(PI()* 52.9519918465976/180.0))
+ (COS(PI()* 52.9519918465976/180)*cos(PI()* 52.9519918465976/180.0)*COS(PI()* -1.14304013581239/180.0-PI()* -1.14304013581239/180.0))
),(1)) AS value(x))
)
我正在使用ACOS计算地理点之间的距离。'-0.0000001'的减法足以使我的结果有一点偏差。所以我用了一个MIN函数(如Craig所说)如下:
SELECT ACOS(
(SIN(PI()* 52.9519918465976/180.0)* SIN(PI()* 52.9519918465976/180.0))
+ (COS(PI()* 52.9519918465976/180)*cos(PI()* 52.9519918465976/180.0)*COS(PI()* -1.14304013581239/180.0-PI()* -1.14304013581239/180.0))
- 0.0000001
)
SELECT ACOS(
(SELECT MIN(x) FROM (VALUES (
(SIN(PI()* 52.9519918465976/180.0)* SIN(PI()* 52.9519918465976/180.0))
+ (COS(PI()* 52.9519918465976/180)*cos(PI()* 52.9519918465976/180.0)*COS(PI()* -1.14304013581239/180.0-PI()* -1.14304013581239/180.0))
),(1)) AS value(x))
)
这样,0到1之间的浮点数的ACO保持精确计算。您是否尝试过将表达式分解为其组件?