我有一个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问题是什么?
提前致谢
你的结果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
)
我使用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保持准确地计算。