MySQL Bug?(三角)

Dex*_*ter 7 mysql trigonometry

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

SELECT 6371 * acos( 0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos( 0.235244203230056 - 0.235244203230056 ) ) 
Run Code Online (Sandbox Code Playgroud)

返回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 ) ) )
Run Code Online (Sandbox Code Playgroud)

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

这是一个错误吗?还是预料到的?

Cze*_*ogy 6

您的查询中有一些舍入错误,这些错误是由浮点运算产生的.

如果您尝试此查询

SELECT -1 + ( 0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos( 0.235244203230056 - 0.235244203230056 ) )
Run Code Online (Sandbox Code Playgroud)

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

SELECT 6371 * acos( 1 + 6.66133814775094e-016 ) 
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为acos只在[-1,1]域上定义.

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

ACOS( IF(val BETWEEN -1 AND 1, val, SIGN(val))
Run Code Online (Sandbox Code Playgroud)