1

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

/* 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 的值实际上是(到相同的小数位数)是:

3.1415926535897932384626433832795028841971693993751

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

为什么 Microchip 使用的值不正确?是否有一些与计算三角函数值相关的深奥原因,或者这只是一个错误?或者也许没关系?

4

2 回答 2

2

事实证明,两者:

3.1415926535897931159979634685441851615905761718750

3.1415926535897932384626433832795028841971693993751

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

3.14159265358979311599796346854
(0x400921FB54442D18)

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

至于为什么他们使用不同的号码?并非所有生成 PI 的算法都会逐位生成它。有些会产生一系列数字,这些数字只会收敛到 pi,而不是一次产生一个数字。一个很好的例子是 PI 的小数值。22/7、179/57、245/78、355/113 等都越来越接近 PI,但它们并没有逐个数字地进行。类似地,由于计算机程序可以轻松计算而流行的多边形近似方法可以计算越来越接近 PI 的连续数字,但不会逐位计算。

于 2015-07-05T12:48:18.770 回答
0

有时会调整这些值以强制舍入到机器编号。17(包括逗号之前)重要的地方是 double 变得不精确的地方(并且编译器中计算精度有限的值的操作甚至可能会使它恶化)

因此库程序员可能已经操纵了该值,以确保从源中的十进制表示到最接近的二进制数四舍五入到“真实”。

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

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

于 2015-07-05T12:08:25.810 回答