首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microchip XC16 dsp.h定义了不正确的PI值?

Microchip XC16 dsp.h定义了不正确的PI值?
EN

Stack Overflow用户
提问于 2015-06-25 03:38:40
回答 2查看 554关注 0票数 1

在XC16编译器的头文件(dsp.h)中,有以下几行:

代码语言:javascript
复制
/* Some constants. */
#ifndef PI                              /* [ */
#define PI 3.1415926535897931159979634685441851615905761718750 /* double */
#endif  /* ] */
#ifndef SIN_PI_Q                                /* [ */
#define SIN_PI_Q 0.7071067811865474617150084668537601828575134277343750
                                                /* sin(PI/4), (double) */
#endif  /* ] */

但是,PI的值实际上是(相同的小数位数)是:

代码语言:javascript
复制
3.1415926535897932384626433832795028841971693993751

Dsp.h定义的值在小数点后第16位开始发散。对于双浮点运算,这是非常重要的。对于Q15表示,这并不重要。sin(pi/4)的值也偏离了小数点后16位的正确值。

为什么Microchip使用不正确的值?是否有一些深奥的原因与计算trig函数值有关,或者这只是一个错误?或者这无关紧要?

EN

回答 2

Stack Overflow用户

发布于 2015-07-05 20:48:19

事实证明,这两者都是:

代码语言:javascript
复制
3.1415926535897931159979634685441851615905761718750

代码语言:javascript
复制
3.1415926535897932384626433832795028841971693993751

当转换为双精度(64位浮点数)时,由相同的二进制数表示:

代码语言:javascript
复制
3.14159265358979311599796346854
(0x400921FB54442D18)

所以在这种情况下没有区别。

至于为什么他们使用不同的数字?并不是所有生成PI的算法都逐位生成PI。有些产生一系列的数字,这些数字只是收敛到π,而不是一次产生一个数字。PI的分数值就是一个很好的例子。22/7,179/57,245/78,355/113等都越来越接近PI,但它们不是逐位执行的。同样,流行的多边形近似方法,因为它们可以很容易地通过计算机程序计算,可以计算越来越接近PI的连续数字,但不是逐位计算。

票数 2
EN

Stack Overflow用户

发布于 2015-07-05 20:08:26

有时会调整这些值以强制四舍五入到机器编号。17 (包括逗号之前)重要的位置是double不精确的地方(编译器中计算有限精度的值的操作可能会使情况变得更糟)

因此,库程序员可能已经对该值进行了操作,以确保从源代码中的十进制数表示到最接近的二进制数舍入到“真正”。

测试将以二进制形式写出数字,可能在前52位数字之后,剩余的数字将为零。

这是16-19位十进制圆周率数字转换回十进制数的最佳二进制表示,这可以产生额外的数字。

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

https://stackoverflow.com/questions/31035526

复制
相关文章

相似问题

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