! First some easy tests for consistency. ! 12/04/01 Corrected some typos in flags: xv->ux, xw->ux 3* ALL 1 1 OK 1 3* ALL 1 2 OK 2 3* ALL 2 1 OK 2 3* ALL 2 3 OK 6 3* ALL 3 2 OK 6 3* ALL 3 3 OK 9 ! Check out sign manipulation. 3* ALL -1 1 OK -1 3* ALL -1 2 OK -2 3* ALL 2 -1 OK -2 3* ALL -2 3 OK -6 3* ALL 3 -2 OK -6 3* ALL -3 3 OK -9 3* ALL -1 -1 OK 1 3* ALL -1 -2 OK 2 3* ALL -2 -1 OK 2 3* ALL -2 -3 OK 6 3* ALL -3 -2 OK 6 3* ALL -3 -3 OK 9 ! Some zero tests, round mode is irrelevant. 3* ALL 0 0 OK 0 3* ALL -0 0 OK -0 3* ALL 0 -0 OK -0 3* ALL -0 -0 OK 0 ! Infinity tests, inf and round modes irrelevant. 3* ALL H H OK H 3* ALL -H H OK -H 3* ALL H -H OK -H 3* ALL -H -H OK H ! Inf * 0 -- always bad news. 3* ALL H 0 i Q ! 3* ALL -0 H i -Q 3* ALL -0 H i Q ! 3* ALL H -0 i -Q 3* ALL H -0 i Q 3* ALL -0 -H i Q ! Inf * small_integer -> Inf. 3* ALL H 1 OK H 3* ALL -2 H OK -H 3* ALL H -3 OK -H 3* ALL -4 -H OK H 3* ALL 5 H OK H 3* ALL -H 6 OK -H 3* ALL 7 -H OK -H 3* ALL -H -8 OK H ! Inf * huge -> Inf. 3* ALL Hm1 H OK H 3* ALL -Hm2 H OK -H 3* ALL H -Hm1 OK -H 3* ALL -H -Hm2 OK H 3* ALL H Hm1d1 OK H 3* ALL -Hm2d1 H OK -H 3* ALL H -Hd1 OK -H 3* ALL -Hd1 -H OK H ! Inf * tiny -> Inf. 3* ALL E H OK H 3* ALL -Ep1 H OK -H 3* ALL H -Ep1 OK -H 3* ALL -H -E OK H 3* ALL H Ep1d1 OK H 3* ALL -Ei1 H OK -H 3* ALL H -Ei1 OK -H 3* ALL -Ep1d1 -H OK H ! Inf * denormalized -> Inf. 3* ALL 0i1 H OK H 3* ALL -0i3 H OK -H 3* ALL H -0i2 OK -H 3* ALL -H -0i4 OK H 3* ALL H Ed1 OK H 3* ALL -Ed1 H OK -H 3* ALL H -Ed1 OK -H 3* ALL -Ed1 -H OK H ! 0 * small_integer -> 0. 3* ALL 0 1 OK 0 3* ALL -2 0 OK -0 3* ALL 0 -3 OK -0 3* ALL -4 -0 OK 0 3* ALL 5 0 OK 0 3* ALL -0 6 OK -0 3* ALL 7 -0 OK -0 3* ALL -0 -8 OK 0 ! 0 * huge -> 0. 3* ALL Hm1 0 OK 0 3* ALL -Hm2 0 OK -0 3* ALL 0 -Hm1 OK -0 3* ALL -0 -Hm2 OK 0 3* ALL 0 Hm1d1 OK 0 3* ALL -Hm2d1 0 OK -0 3* ALL 0 -Hm2d1 OK -0 3* ALL -Hm1d1 -0 OK 0 3* ALL Hd1 0 OK 0 3* ALL -Hd1 -0 OK 0 3* ALL 0 -Hd1 OK -0 3* ALL -0 Hd1 OK -0 ! 0 * tiny -> 0. 3* ALL E 0 OK 0 3* ALL -Ep1 0 OK -0 3* ALL 0 -Ep1 OK -0 3* ALL -0 -E OK 0 3* ALL 0 Ep1d1 OK 0 3* ALL -Ei1 0 OK -0 3* ALL 0 -Ei1 OK -0 3* ALL -Ep1d1 -0 OK 0 ! 0 * denormalized -> 0. 3* ALL 0i1 0 OK 0 3* ALL -0i3 0 OK -0 3* ALL 0 -0i2 OK -0 3* ALL -0 -0i4 OK 0 3* ALL 0 Ed1 OK 0 3* ALL -Ed1 0 OK -0 3* ALL 0 -Ed1 OK -0 3* ALL -Ed1 -0 OK 0 ! Exact cases huge and 2. 3* ALL 2 Hm2 OK Hm1 3* ALL Hm2 -2 OK -Hm1 3* ALL -2 Hm2d1 OK -Hm1d1 3* ALL 2 -Hm2d3 OK -Hm1d3 3* ALL 2 Hm2 OK Hm1 3* ALL Hm2 -2 OK -Hm1 3* ALL -2 Hm2d1 OK -Hm1d1 3* ALL 2 -Hm2d3 OK -Hm1d3 3* ALL 2 Hm1d1 OK Hd1 3* ALL Hm1d1 -2 OK -Hd1 3* ALL -2 Hm2i1 OK -Hm1i1 3* ALL 2 -Hm2i3 OK -Hm1i3 3* ALL 2 Hm1d1 OK Hd1 3* ALL Hm1d1 -2 OK -Hd1 3* ALL -2 Hm2i1 OK -Hm1i1 3* ALL 2 -Hm2i3 OK -Hm1i3 ! Exact cases huge and 4. 3* ALL 4 Hm2d1 OK Hd1 3* ALL -4 Hm2d1 OK -Hd1 3* ALL 4 -Hm2d1 OK -Hd1 3* ALL -4 -Hm2d1 OK Hd1 3* ALL 4 Hm2d1 OK Hd1 3* ALL -4 Hm2d1 OK -Hd1 3* ALL 4 -Hm2d1 OK -Hd1 3* ALL -4 -Hm2d1 OK Hd1 3* ALL Hm2d3 4 OK Hd3 3* ALL Hm2d3 -4 OK -Hd3 3* ALL -Hm2d3 4 OK -Hd3 3* ALL -Hm2d3 -4 OK Hd3 3* ALL Hm2d3 4 OK Hd3 3* ALL Hm2d3 -4 OK -Hd3 3* ALL -Hm2d3 4 OK -Hd3 3* ALL -Hm2d3 -4 OK Hd3 ! Exact cases tiny and 2. 3* ALL 2 E OK Ep1 3* ALL E -2 OK -Ep1 3* ALL -2 Ei1 OK -Ep1i1 3* ALL 2 -Ei3 OK -Ep1i3 3* ALL 2 E OK Ep1 3* ALL E -2 OK -Ep1 3* ALL -2 Ei9 OK -Ep1i9 3* ALL 2 -Ei5 OK -Ep1i5 3* ALL 2 Ei1 OK Ep1i1 3* ALL Ei1 -2 OK -Ep1i1 3* ALL -2 Ei5 OK -Ep1i5 3* ALL 2 -Ei3 OK -Ep1i3 3* ALL 2 Ei1 OK Ep1i1 3* ALL Ei1 -2 OK -Ep1i1 3* ALL -2 Ei5 OK -Ep1i5 3* ALL 2 -Ei3 OK -Ep1i3 ! Just below denormalization threshold. 3* ALL Ed1 2 OK Ep1d2 3* ALL -2 Ed3 OK -Ep1d6 3* ALL -Ed3 -2 OK Ep1d6 3* ALL -2 Ed3 OK -Ep1d6 3* ALL Ed4 2 OK Ep1d8 3* ALL 2 -Ed3 OK -Ep1d6 ! Normalizing tinies. 3* ALL 0i1 2 OK 0i2 3* ALL 3 0i2 OK 0i6 3* ALL -0i1 5 OK -0i5 3* ALL 1 -0i9 OK -0i9 3* ALL -0i4 -1 OK 0i4 3* ALL 4 0i2 OK 0i8 3* ALL 0i1 2 OK 0i2 3* ALL 3 0i2 OK 0i6 3* ALL -0i1 5 OK -0i5 3* ALL 1 -0i9 OK -0i9 3* ALL -0i4 -1 OK 0i4 3* ALL 4 0i2 OK 0i8 3* ALL 0i1 2 OK 0i2 3* ALL 3 0i2 OK 0i6 3* ALL -0i1 5 OK -0i5 3* ALL 1 -0i9 OK -0i9 3* ALL -0i4 -1 OK 0i4 3* ALL 4 0i2 OK 0i8 3* ALL 0i1 2 OK 0i2 3* ALL 3 0i2 OK 0i6 3* ALL -0i1 5 OK -0i5 3* ALL 1 -0i9 OK -0i9 3* ALL -0i4 -1 OK 0i4 3* ALL 4 0i2 OK 0i8 ! 1.0 * various. 3* ALL 1 Ep1i3 OK Ep1i3 3* ALL -Ep1d2 1 OK -Ep1d2 3* ALL -1 Ei9 OK -Ei9 3* ALL -Ei1 -1 OK Ei1 3* ALL 1 Ep1i3 OK Ep1i3 3* ALL -Ep1d2 1 OK -Ep1d2 3* ALL -1 Ei9 OK -Ei9 3* ALL -Ei1 -1 OK Ei1 3* ALL 1 Ed3 OK Ed3 3* ALL -0i2 1 OK -0i2 3* ALL -1 0i9 OK -0i9 3* ALL -Ed1 -1 OK Ed1 3* ALL 1 Ed3 OK Ed3 3* ALL -0i2 1 OK -0i2 3* ALL -1 0i9 OK -0i9 3* ALL -Ed1 -1 OK Ed1 ! Now some tricky rounding cases involving ! 1.0 with some ulps. ! result = 1.00000...010|000...0001 3* =0< 1i1 1i1 x 1i2 3* > 1i1 1i1 x 1i3 ! Try signs... 3* =0> -1i1 1i1 x -1i2 3* < -1i1 1i1 x -1i3 3* =0> 1i1 -1i1 x -1i2 3* < 1i1 -1i1 x -1i3 3* =0< -1i1 -1i1 x 1i2 3* > -1i1 -1i1 x 1i3 ! result = 1.0000..011|0000100 3* =0< 1i2 1i1 x 1i3 3* > 1i2 1i1 x 1i4 ! Try signs... 3* =0> -1i2 1i1 x -1i3 3* < -1i2 1i1 x -1i4 3* =0> 1i1 -1i2 x -1i3 3* < 1i1 -1i2 x -1i4 3* =0< -1i2 -1i1 x 1i3 3* > -1i1 -1i2 x 1i4 3* > -1i2 -1i1 x 1i4 3* =0< -1i1 -1i2 x 1i3 ! (m + k ulps of m) * (1 + j ulps of 1) ! = m + (k + m*j/2^floor(log m)) ulps of m + tiny. 3* => 3i1 1i1 x 3i3 3* 0< 3i1 1i1 x 3i2 3* >= 3i1 1i3 x 3i6 3* 0< 3i1 1i3 x 3i5 3* =< -3i1 1i1 x -3i3 3* 0> -3i1 1i1 x -3i2 3* <= 3i1 -1i3 x -3i6 3* 0> 3i1 -1i3 x -3i5 3* > 5i1 1i1 x 5i3 3* =0< 5i1 1i1 x 5i2 3* > -5i1 -1i1 x 5i3 3* =0< -5i1 -1i1 x 5i2 3* >= 7i1 1i1 x 7i3 3* <0 7i1 1i1 x 7i2 3* 0<= 3d1 1d1 x 3d2 3* > 3d1 1d1 x 3d1 3* 0< 3d1 1d3 x 3d4 3* => 3d1 1d3 x 3d3 3* 0>= -3d1 1d1 x -3d2 3* < -3d1 1d1 x -3d1 3* 0> 3d1 -1d3 x -3d4 3* =< 3d1 -1d3 x -3d3 3* => 3d1 1d2 x 3d2 3* 0< 3d1 1d2 x 3d3 3* 0<= 5d1 1d1 x 5d2 3* > 5d1 1d1 x 5d1 3* 0<= -5d1 -1d1 x 5d2 3* > -5d1 -1d1 x 5d1 3* <=0 7d1 1d1 x 7d2 3* > 7d1 1d1 x 7d1 3* => 7d1 1d4 x 7d4 3* 0< 7d1 1d4 x 7d5 ! Some overflow conditions, watching round mode. 3* => Hm1 2 ox H 3* 0< Hm1 2i1 ox Hd1 3* =< -3d2 Hm1 ox -H 3* 0> Hm1 -4i5 ox -Hd1 3* => -5d2 -Hm1 ox H 3* 0< Hm1 6i1 ox Hd1 3* =< -7d7 Hm1 ox -H 3* 0> Hm1 -8i3 ox -Hd1 3* => -9i1 -Hm1 ox H 3* 0< Hm1 6 ox Hd1 3* =< -9 Hm1 ox -H 3* 0> Hm1 -2 ox -Hd1 3* 0< -7 -Hm1 ox Hd1 3* => Hm1 2 ox H 3* 0> -5 Hm1 ox -Hd1 3* 0> Hm1 -2 ox -Hd1 3* => -3 -Hm1 ox H ! Heavy overflow conditions, watching round mode. 3* => Hm1 Hm1 xo H 3* =< -Hd3 Hm1 xo -H 3* =< Hm1 -Hm2i4 xo -H 3* => -Hm1i5 -Hm1i1 ox H 3* => Hm1i9 Hd6 xo H 3* =< -Hm2d7 Hm1 xo -H 3* =< Hm1 -Hm2 xo -H 3* => -Hd1 -Hd1 xo H 3* 0< Hm1 Hm2i6 xo Hd1 3* =< -Hm1d9 Hm2i1 xo -H 3* =< Hm1 -Hm1 xo -H 3* 0< -Hm2d7 -Hd1 xo Hd1 3* => Hm1 Hd2 xo H 3* 0> -Hm2 Hm1 xo -Hd1 3* 0> Hm1i9 -Hm2i2 xo -Hd1 3* => -Hd3 -Hm1i1 xo H ! Mixed bag overflow conditions, watching round mode ! Tricky cases require careful look at power series ! expansion. Example -- -Hmd1 * 1i1 below: ! In single... ! -(2^127 (1 - 2^-24)) * (1 + 2^-23) --> ! -( 2^127 (1 + 2^-24 - 2^-47) ) --> ! -2^127 except when rounding <, in which ! case -( 2^127 (1 + 2^-23) ); that is, ! -Hm or -Hmi1, respectively! 3* =0> -Hm1d1 1i1 x -Hm1 3* < -Hm1d1 1i1 x -Hm1i1 3* =0< -1d1 -Hd1 x Hd2 3* > -1d1 -Hd1 x Hd1 3* < -Hm2d1 2i1 x -Hm1i1 3* =0> -Hm2d1 2i1 x -Hm1 3* <= Hm1d3 -2i8 xo -H 3* >0 Hm1d3 -2i8 xo -Hd1 3* =0< -Hm2d7 -4d1 x Hd8 3* > -Hm2d7 -4d1 x Hd7 3* => 1i2 Hd2 xo H 3* 0< 1i2 Hd2 xo Hd1 3* =< Hm1i9 -6i2 xo -H 3* 0> Hm1i9 -6i2 xo -Hd1 3* => -Hd3 -3i1 xo H 3* 0< -Hd3 -3i1 xo Hd1 ! Exact and below denomalization threshold -- no underflow. 3* ALL E 1d2 OK Ed1 3* ALL 0i1 1 OK 0i1 3* ALL 1 -0i1 OK -0i1 3* ALL Ep1d2 1m1 OK Ed1 3* ALL -Ep1d4 -1m1 OK Ed2 3* ALL Ep1d2 -1m1 OK -Ed1 3* ALL -Ep1d4 1m1 OK -Ed2 3* ALL Ep1d8 1m1 OK Ed4 3* ALL 0i8 1m3 OK 0i1 3* ALL 0i6 1m1 OK 0i3 3* ALL -0i8 1m3 OK -0i1 3* ALL 0i6 -1m1 OK -0i3 ! Inexact, extreme underflows. 3* =0< E E xu 0 3* =0< -E -E xu 0 3* > E Ep1 xu 0i1 3* > -Ep1 -Ep1 xu 0i1 3* =0> -E E xu -0 3* =0> E -E xu -0 3* < -E Ep1 xu -0i1 3* < E -E xu -0i1 3* =0< Ed1 Ed2 xu 0 3* =0< -Ed1 -Ed2 xu 0 3* > Ed1 Ed2 xu 0i1 3* > -Ed1 -Ed2 xu 0i1 3* =0> -Ed9 Ep1i3 xu -0 3* =0> Ed9 -Ep1i3 xu -0 3* < -Ed9 Ep1i3 xu -0i1 3* < Ed9 -Ep1i3 xu -0i1 3* > 0i1 1m1 xu 0i1 3* =0< 0i1 1m1 xu 0 3* < 1m1 -0i1 xu -0i1 3* =0> 1m1 -0i1 xu -0 3* <0 0i1 1d1 xu 0 3* => 0i1 1d1 xu 0i1 3* > 0i1 0i1 xu 0i1 3* =0< 0i1 0i1 xu 0 3* >0 -0i1 1d1 xu -0 3* =< 0i1 -1d1 xu -0i1 3* < 0i1 -0i1 xu -0i1 3* =0> -0i1 0i1 xu -0 ! Underflow, barely. 3* 0< Ep1d1 1m1 xu Ed1 3* 0< -Ep1d1 -1m1 xu Ed1 3* 0> -Ep1d1 1m1 xu -Ed1 3* >= Ep1d1 1m1 xu E 3* <= Ep1d1 -1m1 xu -E 3* 0< Ed1 1i1 xu Ed1 3* 0> Ed1 -1i1 xu -Ed1 3* 0< Ei1 1d6 xu Ed3 3* > Ed2 1d4 xu Ed3 3* 0< Ed4 1i1 xu Ed4 3* 0< Ei1 1d2 xu Ed1 ! Underflow, unless detected as accuracy loss due to denormalization. 3* >= Ed2 1i1 ux Ed1 3* <= Ed2 -1i1 ux -Ed1 3* >= Ed8 1i1 ux Ed7 3* <= -Ed9 1i1 ux -Ed8 3* <= Ed8 -1i1 ux -Ed7 3* => Ei1 1d6 ux Ed2 3* <=0 Ed2 1d4 ux Ed4 ! Underflow, only if tininess is detected before rounding. 3* >= Ed1 1i1 ux E 3* <= -Ed1 1i1 ux -E 3* >= Ed8 1i8 ux E 3* <= Ed8 -1i8 ux -E 3* >= Ei1 1d2 ux E 3* >= Ei2 1d4 ux E ! NaN operands. Signaling NaN cases commented out . 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