MySQL 缺陷?(三角函数)

7

我正在通过为表中的字段预先计算一些三角函数来优化查询,但我偶然发现了这个:

SELECT 6371 * acos( 0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos( 0.235244203230056 - 0.235244203230056 ) ) 

返回 null

使用未预计算的值进行的查询:

SELECT 6371 * acos( sin( radians( 52.51581 ) ) * sin( radians( 52.51581 ) ) + cos( radians( 52.51581 ) ) * cos( radians( g.lat ) ) * cos( radians( 13.4785 ) - radians( 13.4785 ) ) )

返回0(这是正确的结果)

这是一个错误吗?还是预期的结果?

2个回答

6
你的查询存在舍入误差,这是由于浮点数算术运算所导致的。
如果你尝试运行这个查询:
SELECT -1 + ( 0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos( 0.235244203230056 - 0.235244203230056 ) )

你将会得到6.66133814775094e-016。所以你要做的是

SELECT 6371 * acos( 1 + 6.66133814775094e-016 ) 

很明显这样做行不通,因为acos仅在[-1,1]域上定义。

我不知道你究竟想要实现什么,但你必须重新计算,例如检查acos的参数是否超出范围,然后相应地设置值,可能像这样:

ACOS( IF(val BETWEEN -1 AND 1, val, SIGN(val))

谢谢,那很有道理!(我正在计算大圆距离) - Dexter

4

ACOS函数在X不在-1到1的范围内时返回NULL。

如果使用未预计算的值,可能会在应用ACOS之前对其进行简化处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接