加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cosf(M_PI_2)不返回零

发布时间:2020-12-16 06:49:09 所属栏目:百科 来源:网络整理
导读:今天早上突然开始. 这是原始的线条 float angle = (x+90)*(M_PI/180.0);float xx = cosf(angle);float yy = sinf(angle); 放入断点并悬停光标后..我得到yy的正确答案为1.但xx不为零. 我尝试过cosf(M_PI_2);仍然没有运气..它工作正常,直到昨天..我没有改变任
今天早上突然开始.

这是原始的线条

float angle = (x+90)*(M_PI/180.0);
float xx = cosf(angle);
float yy = sinf(angle);

放入断点并悬停光标后..我得到yy的正确答案为1.但xx不为零.

我尝试过cosf(M_PI_2);仍然没有运气..它工作正常,直到昨天..我没有改变任何编译器设置等..

我正在使用截至今天的Xcode最新版本

解决方法

与其他人所说的相反,这不是x87协处理器问题.默认情况下,XCode在Intel上使用SSE进行浮点计算(长双精度算法除外).

“问题”是:当您编写cosf(M_PI_2)时,您实际上是在告诉XCode编译器(gcc或llvm-gcc或clang)执行以下操作:

>在< math.h>中查找M_PI_2的扩展.根据POSIX标准,它是一个双精度字面值,可以转换为正确舍入的π/ 2值.
>将转换后的双精度值舍入为单精度.
>在单精度值上调用数学库函数cosf.

请注意,在整个过程中,您不会对π/ 2的实际值进行操作.相反,您将对该值进行操作,舍入为可表示的浮点数.虽然cos(π/ 2)恰好为零,但您并没有告诉编译器进行该计算.你是告诉编译器做cos(π/ 2微小),其中tiny是舍入值(float)M_PI_2和π/ 2的(不可表示的)精确值之间的差值.如果计算cos而没有任何误差,则cos(π/ 2微小)的结果约为-tiny.如果它返回零,那将是一个错误.

编辑:使用当前的XCode编译器逐步扩展Intel Mac上的计算:

M_PI_2被定义为

1.57079632679489661923132169163975144

但这实际上并不是一个可表示的双精度数.当编译器将其转换为双精度值时,它就会完全变为

1.5707963267948965579989817342720925807952880859375

这是与π/ 2最接近的双精度数,但它与π/ 2的实际数学值相差约6.12 * 10 ^( – 17).

步骤(2)将此数字舍入为单精度,将值精确地更改为

1.57079637050628662109375

大约π/ 2 4.37 * 10 ^( – 8).当我们计算这个数字的cosf时,我们得到:

-0.00000004371138828673792886547744274139404296875

这几乎是在此时评估的余弦的精确值:

-0.00000004371139000186241438857289400265215231661...

事实上,这是正确的圆润结果;计算可能没有返回更准确的值.这里唯一的错误是您要求编译器执行的计算与您认为要求它执行的计算不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读