! First some easy integer cases. 3+ ALL 1 1 OK 2 3+ ALL 1 2 OK 3 3+ ALL 2 1 OK 3 3+ ALL 2 2 OK 4 3+ =0> 2 -2 OK 0 3+ < 2 -2 OK -0 3+ =0> 5 -5 OK 0 3+ < 5 -5 OK -0 3+ ALL 1 7 OK 8 3+ ALL 5 -1 OK 4 3+ ALL 2 -5 OK -3 3+ ALL 5 -0 OK 5 3+ ALL 5 +0 OK 5 ! Infinity vs Infinity. 3+ ALL H H OK H ok - affine sum 3+ ALL -H -H OK -H 3+ ALL -H H i Q different signs 3+ ALL H -H i Q ! Infinity vs huge. 3+ ALL H Hm1 OK H 3+ ALL H -Hm1 OK H 3+ ALL -H Hm1 OK -H 3+ ALL -H -Hm1 OK -H 3+ ALL Hm1 H OK H 3+ ALL Hm1 -H OK -H 3+ ALL -Hm1 H OK H 3+ ALL -Hm1 -H OK -H ! Infinity vs 0. 3+ ALL H 0 OK H 3+ ALL H -0 OK H 3+ ALL -H 0 OK -H 3+ ALL -H -0 OK -H 3+ ALL 0 H OK H 3+ ALL -0 H OK H 3+ ALL 0 -H OK -H 3+ ALL -0 -H OK -H ! Infinity vs denormalized. 3+ ALL H Ed1 OK H 3+ ALL -H Ed1 OK -H 3+ ALL H -Ed1 OK H 3+ ALL -H -Ed1 OK -H 3+ ALL 0i3 H OK H 3+ ALL 0i3 -H OK -H 3+ ALL -0i3 H OK H 3+ ALL -0i3 -H OK -H ! Zero vs finite -- watch that sign of 0 is meaningless. 3+ ALL 0 Hm1 OK Hm1 3+ ALL -0 Hm1 OK Hm1 3+ ALL -Hm1 0 OK -Hm1 3+ ALL -Hm1 -0 OK -Hm1 3+ ALL 1 -0 OK 1 3+ ALL -1 -0 OK -1 3+ ALL 0 1 OK 1 3+ ALL -0 -1 OK -1 ! Zero vs denormalized -- underflows. 3+ ALL 0 Ed1 OK Ed1 3+ ALL -0 Ed1 OK Ed1 3+ ALL 0 -Ed1 OK -Ed1 3+ ALL -0 -Ed1 OK -Ed1 3+ ALL 0i3 0 OK 0i3 3+ ALL 0i3 -0 OK 0i3 3+ ALL -0i3 0 OK -0i3 3+ ALL -0i3 -0 OK -0i3 ! Zero vs tiny -- just in case. 3+ ALL -0 -E OK -E 3+ ALL E 0 OK E 3+ ALL 0 -E OK -E 3+ ALL -E 0 OK -E ! Zero vs Zero -- watch signs and rounding modes. 3+ =0> 0 -0 OK 0 3+ =0> -0 0 OK 0 3+ < 0 -0 OK -0 3+ < -0 0 OK -0 3+ ALL 0 0 OK 0 3+ ALL -0 -0 OK -0 ! Double a number -- may overflow so watch rounding mode. 3+ => Hm1 Hm1 xo H 3+ 0< Hm1 Hm1 xo Hd1 3+ =< -Hm1 -Hm1 xo -H 3+ 0> -Hm1 -Hm1 xo -Hd1 3+ ALL Hm1d2 Hm1d2 OK Hd2 3+ ALL -Hm1d2 -Hm1d2 OK -Hd2 3+ => Hd2 Hd2 xo H 3+ 0< Hd2 Hd2 xo Hd1 3+ =< -Hd2 -Hd2 xo -H 3+ 0> -Hd2 -Hd2 xo -Hd1 ! Double an innocent number. 3+ ALL 1 1 OK 2 3+ ALL 3 3 OK 6 3+ ALL E E OK Ep1 3+ ALL Hm2 Hm2 OK Hm1 ! Double a tiny number -- may underflow. 3+ ALL Ed1 Ed1 OK Ep1d2 3+ ALL -Ed1 -Ed1 OK -Ep1d2 3+ ALL 0i4 0i4 OK 0i8 3+ ALL -0i4 -0i4 OK -0i8 3+ ALL 0i1 0i1 OK 0i2 3+ ALL -0i1 -0i1 OK -0i2 ! Cancellation to 0 -- to plus 0. 3+ =0> Hm1 -Hm1 OK 0 3+ =0> -Hm1d2 Hm1d2 OK 0 3+ =0> 1 -1 OK 0 3+ =0> -3 3 OK 0 3+ =0> E -E OK 0 3+ =0> -E E OK 0 3+ =0> Ed4 -Ed4 OK 0 3+ =0> -Ed1 Ed1 OK 0 no underflow 3+ =0> 0i1 -0i1 OK 0 3+ =0> -0i1 0i1 OK 0 3+ =0> Hd1 -Hd1 OK 0 ! Cancellation to 0 -- to minus 0. 3+ < Hm1 -Hm1 OK -0 3+ < -Hm1d2 Hm1d2 OK -0 3+ < 1 -1 OK -0 3+ < -3 3 OK -0 3+ < E -E OK -0 3+ < -E E OK -0 3+ < Ed4 -Ed4 OK -0 3+ < -Ed1 Ed1 OK -0 no underflow 3+ < 0i1 -0i1 OK -0 3+ < -0i1 0i1 OK -0 3+ < Hd1 -Hd1 OK -0 ! Cancel forcing normalization of LSB (no rounding errors). ! Difference is in last place of larger number. ! Medium numbers... 3+ ALL 1i1 -1 OK 1u1 3+ ALL -1i1 1 OK -1u1 3+ ALL 1i1 -1i2 OK -1u1 3+ ALL -1i1 1i2 OK 1u1 3+ ALL 2 -2i1 OK -2u1 3+ ALL -2 2i1 OK 2u1 3+ ALL 2i4 -2i3 OK 2u1 3+ ALL -2i4 2i3 OK -2u1 3+ ALL 4d1 -4d2 OK 3u1 3+ ALL -4d1 4d2 OK -3u1 3+ ALL 2d4 -2d3 OK -1u1 3+ ALL -2d4 2d3 OK 1u1 ! Huge numbers... 3+ ALL Hm1i1 -Hm1 OK Hm1u1 3+ ALL -Hm1i1 Hm1 OK -Hm1u1 3+ ALL Hm1i1 -Hm1i2 OK -Hm1u1 3+ ALL -Hm1i1 Hm1i2 OK Hm1u1 3+ ALL Hm2 -Hm2i1 OK -Hm2u1 3+ ALL -Hm2 Hm2i1 OK Hm2u1 3+ ALL Hm2i4 -Hm2i3 OK Hm2u1 3+ ALL -Hm2i4 Hm2i3 OK -Hm2u1 3+ ALL Hm2d1 -Hm2d2 OK Hm3u1 3+ ALL -Hm2d1 Hm2d2 OK -Hm3u1 3+ ALL -Hd2 Hd1 OK Hd1u1 3+ ALL Hd2 -Hd1 OK -Hd1u1 ! Tiny numbers... 3+ ALL -Ei1 E OK -Eu1 3+ ALL Ei1 -E OK Eu1 3+ ALL -Ed1 E OK Eu1 3+ ALL Ed1 -E OK -Eu1 3+ ALL Ei1 -Ei2 OK -Eu1 3+ ALL -Ei1 Ei2 OK Eu1 3+ ALL Ed1 -Ed2 OK Eu1 3+ ALL -Ed1 Ed2 OK -Eu1 3+ ALL Ed3 -Ed2 OK -Eu1 3+ ALL -Ed3 Ed2 OK Eu1 3+ ALL 0i2 -0i1 OK Eu1 3+ ALL -0i2 0i1 OK -Eu1 3+ ALL 0i3 -0i2 OK Eu1 3+ ALL -0i3 0i2 OK -Eu1 ! Normalize from round bit -- set up tests so that operands have ! exponents differing by 1 unit. ! Medium numbers... 3+ ALL 2 -2d1 OK 1u1 3+ ALL -2 2d1 OK -1u1 3+ ALL -2d1 2 OK 1u1 3+ ALL 2d1 -2 OK -1u1 3+ ALL 4i1 -4d1 OK 3u3 3+ ALL -4i1 4d1 OK -3u3 3+ ALL 4d1 -4i2 OK -3u5 3+ ALL -4d1 4i2 OK 3u5 3+ ALL 2i1 -1i1 OK 1i1 3+ ALL -2i1 1i1 OK -1i1 3+ ALL 2i2 -1i1 OK 1i3 3+ ALL -2i2 1i1 OK -1i3 3+ ALL 2i2 -1i3 OK 1i1 3+ ALL -2i2 1i3 OK -1i1 ! Huge numbers... 3+ ALL Hm2 -Hm2d1 OK Hm3u1 3+ ALL -Hm2 Hm2d1 OK -Hm3u1 3+ ALL -Hm1d1 Hm1 OK Hm2u1 3+ ALL Hm1d1 -Hm1 OK -Hm2u1 3+ ALL Hm4i1 -Hm4d1 OK Hm5u3 3+ ALL -Hm4i1 Hm4d1 OK -Hm5u3 3+ ALL Hm2d1 -Hm2i2 OK -Hm3u5 3+ ALL -Hm2d1 Hm2i2 OK Hm3u5 3+ ALL Hm2i1 -Hm1i1 OK -Hm2i1 3+ ALL -Hm2i1 Hm1i1 OK Hm2i1 3+ ALL Hm1i2 -Hm2i1 OK Hm2i3 3+ ALL -Hm1i2 Hm2i1 OK -Hm2i3 3+ ALL Hm2i2 -Hm3i3 OK Hm3i1 3+ ALL -Hm2i2 Hm3i3 OK -Hm3i1 ! Tiny numbers... 3+ ALL Ep1 -Ep1d1 OK Eu1 3+ ALL -Ep1 Ep1d1 OK -Eu1 3+ ALL -Ep1d1 Ep1 OK Eu1 3+ ALL Ep1d1 -Ep1 OK -Eu1 3+ ALL Ep1i1 -Ep1d1 OK Eu3 3+ ALL -Ep1i1 Ep1d1 OK -Eu3 3+ ALL Ep2 -Ep2d1 OK Eu2 3+ ALL -Ep2 Ep2d1 OK -Eu2 3+ ALL -Ep2d1 Ep2 OK Eu2 3+ ALL Ep2d1 -Ep2 OK -Eu2 3+ ALL Ep2i1 -Ep2d1 OK Eu6 3+ ALL -Ep2i1 Ep2d1 OK -Eu6 3+ ALL Ep1d1 -Ep1i2 OK -Eu5 3+ ALL -Ep1d1 Ep1i2 OK Eu5 3+ ALL Ep1d1 -Ep1i4 OK -Eu9 3+ ALL -Ep1d1 Ep1i4 OK Eu9 3+ ALL Ep1i1 -Ei1 OK Ei1 3+ ALL -Ep1i1 Ei1 OK -Ei1 3+ ALL Ep1i2 -Ei1 OK Ei3 3+ ALL -Ep1i2 Ei1 OK -Ei3 3+ ALL Ep2i2 -Ep1i3 OK Ep1i1 3+ ALL -Ep2i2 Ep1i3 OK -Ep1i1 ! Add magnitude: ! cases where one operand is off in sticky -- rounding ! perhaps to an overflow. ! Huge vs medium. 3+ =0< Hm1 1 x Hm1 3+ > Hm1 1 x Hm1i1 3+ =0> -Hm1 -1 x -Hm1 3+ < -Hm1 -1 x -Hm1i1 3+ =0< Hm1d1 1 x Hm1d1 3+ > Hm1d1 1 x Hm1 3+ =0> -Hm1d1 -1 x -Hm1d1 3+ < -Hm1d1 -1 x -Hm1 3+ =0< Hd1 1 x Hd1 3+ > Hd1 1 xo H nowadays signal overflow 3+ =0> -Hd1 -1 x -Hd1 3+ < -Hd1 -1 xo -H 3+ =0< Hd2 1 x Hd2 3+ > Hd2 1 x Hd1 3+ =0> -Hd2 -1 x -Hd2 3+ < -Hd2 -1 x -Hd1 ! Huge vs denormal. 3+ =0< 0i1 Hm1 x Hm1 3+ > 0i1 Hm1 x Hm1i1 3+ =0> -0i1 -Hm1 x -Hm1 3+ < -0i1 -Hm1 x -Hm1i1 3+ =0< 0i1 Hm1d1 x Hm1d1 3+ > 0i1 Hm1d1 x Hm1 3+ =0> -0i1 -Hm1d1 x -Hm1d1 3+ < -0i1 -Hm1d1 x -Hm1 3+ =0< 0i1 Hd1 x Hd1 3+ > 0i1 Hd1 xo H nowadays signal overflow 3+ =0> -0i1 -Hd1 x -Hd1 3+ < -0i1 -Hd1 xo -H 3+ =0< 0i1 Hd2 x Hd2 3+ > 0i1 Hd2 x Hd1 3+ =0> -0i1 -Hd2 x -Hd2 3+ < -0i1 -Hd2 x -Hd1 ! Medium vs denormal. 3+ =0< 0i1 1 x 1 3+ > 0i1 1 x 1i1 3+ =0> -0i1 -1 x -1 3+ < -0i1 -1 x -1i1 3+ =0< 0i1 1d1 x 1d1 3+ > 0i1 1d1 x 1 3+ =0> -0i1 -1d1 x -1d1 3+ < -0i1 -1d1 x -1 3+ =0< 0i1 2d1 x 2d1 3+ > 0i1 2d1 x 2 3+ =0> -0i1 -2d1 x -2d1 3+ < -0i1 -2d1 x -2 3+ =0< 0i1 2d2 x 2d2 3+ > 0i1 2d2 x 2d1 3+ =0> -0i1 -2d2 x -2d2 3+ < -0i1 -2d2 x -2d1 ! ! Magnitude subtract when an operand is in the sticky bit. ! The interesting cases will arise when directed rounding ! forces a nonzero cancellation. ! Huge and medium. 3+ => Hm1 -1 x Hm1 3+ 0< Hm1 -1 x Hm1d1 3+ =< -Hm1 1 x -Hm1 3+ 0> -Hm1 1 x -Hm1d1 3+ => Hm1d1 -1 x Hm1d1 3+ 0< Hm1d1 -1 x Hm1d2 3+ =< -Hm1d1 1 x -Hm1d1 3+ 0> -Hm1d1 1 x -Hm1d2 3+ => Hd1 -1 x Hd1 3+ 0< Hd1 -1 x Hd2 3+ =< -Hd1 1 x -Hd1 3+ 0> -Hd1 1 x -Hd2 3+ => Hd2 -1 x Hd2 3+ 0< Hd2 -1 x Hd3 3+ =< -Hd2 1 x -Hd2 3+ 0> -Hd2 1 x -Hd3 ! Huge and tiny. 3+ => Hd1 -0i1 x Hd1 3+ 0< Hd1 -0i1 x Hd2 3+ =< -Hd1 0i1 x -Hd1 3+ 0> -Hd1 0i1 x -Hd2 3+ => -0i3 Hm1 x Hm1 3+ 0< -0i3 Hm1 x Hm1d1 3+ =< 0i3 -Hm1 x -Hm1 3+ 0> 0i3 -Hm1 x -Hm1d1 ! Medium and tiny. 3+ => 1d1 -0i1 x 1d1 3+ 0< 1d1 -0i1 x 1d2 3+ =< -2d1 0i1 x -2d1 3+ 0> -2d1 0i1 x -2d2 3+ => -0i3 3 x 3 3+ 0< -0i3 3 x 3d1 3+ =< 0i3 -5 x -5 3+ 0> 0i3 -5 x -5d1 ! ! Add magnitude with difference in LSB so, except for denorms, ! round bit is crucial. Half-way cases arise. ! Medium cases. 3+ =0< 1i1 1 x 2 3+ > 1i1 1 x 2i1 3+ =0> -1i1 -1 x -2 3+ < -1i1 -1 x -2i1 3+ =0> -2 -2i1 x -4 3+ < -2 -2i1 x -4i1 3+ =0< 2 2i1 x 4 3+ > 2 2i1 x 4i1 3+ => 1 1i3 x 2i2 3+ 0< 1 1i3 x 2i1 3+ =< -1 -1i3 x -2i2 3+ 0> -1 -1i3 x -2i1 3+ =< -2i1 -2i2 x -4i2 3+ 0> -2i1 -2i2 x -4i1 3+ => 2i1 2i2 x 4i2 3+ 0< 2i1 2i2 x 4i1 ! Huge cases. 3+ => Hd2 Hd1 xo H 3+ 0< Hd2 Hd1 xo Hd1 3+ =< -Hd2 -Hd1 xo -H 3+ 0> -Hd2 -Hd1 xo -Hd1 3+ => Hm1d1 Hm1 xo H 3+ 0< Hm1d1 Hm1 x Hd1 3+ =< -Hm1d1 -Hm1 xo -H 3+ 0> -Hm1d1 -Hm1 x -Hd1 3+ => Hm1i1 Hm1 xo H 3+ 0< Hm1i1 Hm1 xo Hd1 3+ =< -Hm1i1 -Hm1 xo -H 3+ 0> -Hm1i1 -Hm1 xo -Hd1 3+ =0< Hm2i1 Hm2 x Hm1 3+ > Hm2i1 Hm2 x Hm1i1 3+ =0> -Hm2i1 -Hm2 x -Hm1 3+ < -Hm2i1 -Hm2 x -Hm1i1 3+ =0< Hm1d2 Hm1d1 x Hd2 3+ > Hm1d2 Hm1d1 x Hd1 3+ =0> -Hm1d2 -Hm1d1 x -Hd2 3+ < -Hm1d2 -Hm1d1 x -Hd1 ! Check rounding. 3+ > 2 1u1 x 2i1 3+ =0< 2 1u1 x 2 3+ => 2i1 1u1 x 2i2 3+ 0< 2i1 1u1 x 2i1 3+ => 4d1 1u1 x 4 3+ 0< 4d1 1u1 x 4d1 3+ > 4d1 1u1d1 x 4 3+ 0=< 4d1 1u1d1 x 4d1 3+ =< -4d1 -1u1 x -4 3+ 0> -4d1 -1u1 x -4d1 3+ < -4d1 -1u1d1 x -4 3+ 0=> -4d1 -1u1d1 x -4d1 !NAN operands. --- SNaN cases commented out <4/29/93, JPO> 3+ ALL Q 0 OK Q 3+ ALL Q -0 OK Q 3+ ALL 0 Q OK Q 3+ ALL -0 Q OK Q 3+ ALL Q 1 OK Q 3+ ALL Q -1 OK Q 3+ ALL 1 Q OK Q 3+ ALL -1 Q OK Q 3+ ALL Ed1 Q OK Q 3+ ALL -Ed1 Q OK Q 3+ ALL Q Ed1 OK Q 3+ ALL Q -Ed1 OK Q 3+ ALL Q 0i1 OK Q 3+ ALL Q -0i1 OK Q 3+ ALL 0i1 Q OK Q 3+ ALL -0i1 Q OK Q 3+ ALL Q Hd1 OK Q 3+ ALL Q -Hd1 OK Q 3+ ALL Hd1 Q OK Q 3+ ALL -Hd1 Q OK Q 3+ ALL Q H OK Q 3+ ALL Q -H OK Q 3+ ALL H Q OK Q 3+ ALL -H Q OK Q 3+ ALL Q Q OK Q !3+ ALL S 0 i Q !3+ ALL S -0 i Q !3+ ALL 0 S i Q !3+ ALL -0 S i Q !3+ ALL S 1 i Q !3+ ALL S -1 i Q !3+ ALL 1 S i Q !3+ ALL -1 S i Q !3+ ALL Ed1 S i Q !3+ ALL -Ed1 S i Q !3+ ALL S Ed1 i Q !3+ ALL S -Ed1 i Q !3+ ALL S 0i1 i Q !3+ ALL S -0i1 i Q !3+ ALL 0i1 S i Q !3+ ALL -0i1 S i Q !3+ ALL S Hd1 i Q !3+ ALL S -Hd1 i Q !3+ ALL Hd1 S i Q !3+ ALL -Hd1 S i Q !3+ ALL S H i Q !3+ ALL S -H i Q !3+ ALL H S i Q !3+ ALL -H S i Q !3+ ALL Q S i Q !3+ ALL S Q i Q !3+ ALL S S i Q