2005年,偶在做数控的轨迹计算时,把编绎链接好的APP发行版(released)拷贝到几台IPC上。当时选了几款IPC工控机,一个用的是INTEL的CPU,一个用的是AMD的CPU。当时的操作系统用的都是WinXPsp3。
在INTELIPC上,运行正常。在AMDIPC上总是出问题,直线与圆弧总是显示没交点。后来,软件跟踪,发现直线一园弧相切的的一个误差计算上,二者存在差异,Intel的误差结果是0.00003,而AMD的是0.00008,软件定义的判断阀值是0.00005。
当时觉得不可思意,但结果就是这样。只能更改判断阀值,为保险期间,设为0.0001。以后所有设备运行,均正常。
大家可以用双精度做一些简单的加、减、乘、除、开方运算,同样的算式,同样的程序,在不同电脑上,运算结果是绝对有差异的。大家平时没有察觉到,是因为大家取的精度比较低。在高精尖的设备上,都很在意计算精度的处理。
不同品牌的电脑,处理与其它设备通讯的速度也有差异,而且还很大,比如串行通讯。做自动控制的人,经常要在不同电脑间进行通讯程序的软件开发。
比如,在A、B、C三台电脑上进行串口通讯测试。通讯设置都一样,一个停止位,无奇偶校验位,波特率115200bps。你会发现,在A,B两台电脑上做好的通讯程序,在A、C电脑上运行时总是发生传输错误。
为什么会这样?这就是波特率计算误差问题。不同频率的电脑,计算所得的实际传输速率是有差异的,一个是115196bps,另一个可能是115236bps。
如何处理才能保证无虞?一是控制传输定时器的频率,二是增加传输数据桢检验。把不正确的去除掉。
总结:同样的程序,在不同电脑上执行结果不一样,这很正常,关键在于软件处理方法。产生的原因也非常多,与硬件的CPU有关,与操作系统有关,与使用的IDE开发工具有关。
对于整数之间的运算,计算机是相当精准的,一般不会有差异,但对于有协处理器参与的浮点运算,尤其是高精度的浮点运算,差异还是有的,所以ZERO阀值的设定显得尤为重要,能显示程序员的编程功力。