注意大小和工程单位。非常接近于零的数字表面上似乎有区别,但区别并不显著,特别是当该数是两个大数之差时。例如,1.9999999e-30 非常接近于 -9.9992112e-33,即使它们在符号上有区别。
VAX 数学运算不如 IEEE 数学运算精确,甚至不同的 IEEE 处理器都可能会有区别。特别是当数学运算涉及很多三角函数时,更是如此。这些函数比人们想象的要复杂得多,而且标准只定义了基本运算函数。即使是在 IEEE 机器之间,也可能存在微妙的差别。回顾有关浮点问题的第 6 章,浮点运算一章。
尝试用 call nonstandard_arithmetic() 运行。这样做还可大幅提高性能,并使 Sun 工作站操作起来更象是 VAX 系统。如果您有权访问 VAX 或某一其他系统,请照此行事。很多数值应用程序在每一种浮点实现上产生的结果会稍微有些不同,这一点相当常见。
检查 NaN、+Inf 及其他可能的错误迹象。有关如何捕获各种异常的说明,请参见第 6 章,浮点运算一章或手册页 ieee_handler(3m)。在大多数机器上,这些异常只是中止运行。
相差 6 x 1029 的两个数仍可以具有相同的浮点形式。在以下示例中,不同数字具有相同的表示形式:
real*4 x,y x=99999990e+29 y=99999996e+29 write (*,10) x, x 10 format(’99,999,990 x 10^29 = ’, e14.8, ’ = ’, z8) write(*,20) y, y 20 format(’99,999,996 x 10^29 = ’, e14.8, ’ = ’, z8) end |
输出为:
99,999,990 x 10^29 = 0.99999993E+37 = 7CF0BDC1 99,999,996 x 10^29 = 0.99999993E+37 = 7CF0BDC1 |
在本例中,差别达 6 x 1029。IEEE 单精度运算是造成此种无法区分的巨大差距的原因,对于任一十进制到二进制的转换,只能保证六位十进制数字。您有可能能够正确转换七位或八位数字,但这取决于具体的数字。