跳转到主要内容

J.11 谬误与陷阱

谬误:实际浮点应用程序很少下溢

多数程序确实很少下溢,但有些实际程序会频繁下溢。求解一维波动方程的 SDRWAVE [Kahaner 1988] 就是例子,正常运行时也常发生下溢。某台机器的测量表明,若增加渐进下溢的硬件支持,SDRWAVE 的速度可提高约 50%。

谬误:整数与浮点数之间的转换很少见

在 spice 中,转换与除法一样频繁。认为转换稀少,导致 SPARC 第 8 版指令集出现了一个设计失误:没有提供从整数寄存器向浮点寄存器移动数据的指令。

陷阱:只提高浮点单元速度,不提高内存带宽

浮点单元的典型任务,是把两个向量相加产生第三个向量。若元素为双精度,每次浮点加法要传送三个 64 位数据,共 24 字节。若浮点单元还能并行执行乘法与加法,而多数单元都能如此,带宽需求会更大。

陷阱:−x 不等于 0−x

这个 IEEE 标准细节难倒过一些设计者。浮点数采用符号与数值分离表示,所以有 +0、−0 两个零。标准规定 0−0=+00-0=+0,而 −(0)=−0-(0)=-0。因此,当 x=0 时,−x 与 0−x 不同。

译注:原文这里按通常的舍入模式说明符号零差异;向 −∞-\infty 舍入时,精确抵消为零的符号另有规则,不能把这一等式无条件套用于所有舍入模式。