3

我的 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

我收到以下错误消息“发生了无效的浮点操作”

有人能看出是什么问题吗?

提前致谢

4

2 回答 2

7

你的结果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
           ) 
于 2012-06-20T09:52:21.047 回答
3

我正在使用 ACOS 来计算地理点之间的距离。'- 0.0000001' 的减法足以使我的结果有些偏差。所以我改为使用 MIN 函数(由 Craig在此处发布),如下所示:

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 之间的浮点数的 ACOS 仍然可以准确计算。

于 2019-02-15T18:34:57.927 回答