出现无效的浮点运算(An invalid floating point operation occu

2019-09-18 07:25发布

我有一个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

我收到以下错误消息“出现无效的浮点运算”

可以看到abody问题是什么?

提前致谢

Answer 1:

你的结果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
           ) 


Answer 2:

我使用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保持准确地计算。



文章来源: An invalid floating point operation occurred