在XC16编译器的头文件(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.1415926535897932384626433832795028841971693993751Dsp.h定义的值在小数点后第16位开始发散。对于双浮点运算,这是非常重要的。对于Q15表示,这并不重要。sin(pi/4)的值也偏离了小数点后16位的正确值。
为什么Microchip使用不正确的值?是否有一些深奥的原因与计算trig函数值有关,或者这只是一个错误?或者这无关紧要?
发布于 2015-07-05 20:48:19
事实证明,这两者都是:
3.1415926535897931159979634685441851615905761718750和
3.1415926535897932384626433832795028841971693993751当转换为双精度(64位浮点数)时,由相同的二进制数表示:
3.14159265358979311599796346854
(0x400921FB54442D18)所以在这种情况下没有区别。
至于为什么他们使用不同的数字?并不是所有生成PI的算法都逐位生成PI。有些产生一系列的数字,这些数字只是收敛到π,而不是一次产生一个数字。PI的分数值就是一个很好的例子。22/7,179/57,245/78,355/113等都越来越接近PI,但它们不是逐位执行的。同样,流行的多边形近似方法,因为它们可以很容易地通过计算机程序计算,可以计算越来越接近PI的连续数字,但不是逐位计算。
发布于 2015-07-05 20:08:26
有时会调整这些值以强制四舍五入到机器编号。17 (包括逗号之前)重要的位置是double不精确的地方(编译器中计算有限精度的值的操作可能会使情况变得更糟)
因此,库程序员可能已经对该值进行了操作,以确保从源代码中的十进制数表示到最接近的二进制数舍入到“真正”。
测试将以二进制形式写出数字,可能在前52位数字之后,剩余的数字将为零。
这是16-19位十进制圆周率数字转换回十进制数的最佳二进制表示,这可以产生额外的数字。
https://stackoverflow.com/questions/31035526
复制相似问题