首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL错误?(三角学)

MySQL错误?(三角学)
EN

Stack Overflow用户
提问于 2011-03-24 05:27:17
回答 2查看 419关注 0票数 7

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

代码语言:javascript
复制
SELECT 6371 * acos( 0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos( 0.235244203230056 - 0.235244203230056 ) ) 

返回null

具有非预计算值的查询:

代码语言:javascript
复制
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(是正确的结果)

这是一个bug吗?或者这是意料之中的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-24 05:37:58

您的查询中存在一些四舍五入错误,这些错误是由于浮点运算造成的。

如果您尝试此查询

代码语言:javascript
复制
SELECT -1 + ( 0.793521289617132 * 0.793521289617132 + 0.608542490648241 * 0.608542490648241 * cos( 0.235244203230056 - 0.235244203230056 ) )

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

代码语言:javascript
复制
SELECT 6371 * acos( 1 + 6.66133814775094e-016 ) 

这显然是行不通的,因为acos只定义在-1,1域上。

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

代码语言:javascript
复制
ACOS( IF(val BETWEEN -1 AND 1, val, SIGN(val))
票数 6
EN

Stack Overflow用户

发布于 2011-03-24 05:37:14

如果X不在-1到1的范围内,则ACOS返回NULL

对于非预算的值,mysql在应用ACOS之前做了一些简化

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5411836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档