using math; using system; test (f,x,y,exp) = puts (msg) $$ pass when rv = catch error f x y; pass = exp === rv; msg = if pass then "PASS"+fmt f x y rv else "FAIL"+fmt f x y rv+" expected "+str exp ; end with fmt f x y rv = " "+str f+" "+str x+" "+str y+" = "+str rv; end; let cases = [ // C1 (-1, 1.1, nan) , (-0.1, 0.9, nan) , (-10, 10.1, nan) // C2 , (10, 309, inf) , (-10, 309, -inf) , (-10, 310, inf) // C3 NOT TESTED // C4 , (nan, 1, nan) , (0, nan, nan) // C5 , (1, 0, 1.0) , (1, 0.5, 1.0) , (1, -0.5, 1.0) , (1, -1, 1.0) , (1, -inf, 1.0) , (1, inf, 1.0) , (1, nan, 1.0) // C6 , (0, 0, 1.0) , (0.5, 0, 1.0) , (-1, 0, 1.0) , (-inf, 0, 1.0) , (inf, 0, 1.0) , (nan, 0, 1.0) // C7 , (0, 1, 0.0) , (0, 3, 0.0) , (0, 1.0, 0.0) , (0, 3.0, 0.0) // C8 , (0, 0.1, 0.0) , (0, 1.1, 0.0) , (0, 2, 0.0) , (0, inf, 0.0) // C9 , (-1, inf, 1.0) , (-1, -inf, 1.0) // C10 , (0.9, -inf, inf) , (0.0, -inf, inf) , (-0.9, -inf, inf) // C11 , (1.1, -inf, 0.0) , (-1.1, -inf, 0.0) , (2, -inf, 0.0) , (-2, -inf, 0.0) // C12 , (0.9, inf, 0.0) , (0.0, inf, 0.0) , (-0.9, inf, 0.0) // C13 , (1.1, inf, inf) , (-1.1, inf, inf) , (2, inf, inf) , (-2, inf, inf) // C14 , (-inf, -1.0, -0.0) , (-inf, -3.0, -0.0) // C15 , (-inf, -0.5, 0.0) , (-inf, -1.5, 0.0) , (-inf, -2, 0.0) // C16 , (-inf, 1.0, -inf) , (-inf, 3.0, -inf) // C17 , (-inf, 0.5, inf) , (-inf, 1.5, inf) , (-inf, 2, inf) // C18 , (inf, -0.5, 0.0) , (inf, -1, 0.0) , (inf, -1.5, 0.0) , (inf, -2, 0.0) // C19 , (inf, 0.5, inf) , (inf, 1, inf) , (inf, 1.5, inf) , (inf, 2, inf) // C20 , (0.0, -11, inf) , (-0.0, -11, -inf) // C21 , (0.0, -11.5, inf) , (-0.0, -11.5, inf) , (0.0, -12, inf) , (-0.0, -12, inf) // base case , ( 2, 1, 2.0) , (-2, 1, -2.0) , ( 2, 2, 4.0) , (-2, 2, 4.0) , ( 2, 3, 8.0) , (-2, 3, -8.0) , ( 3, -1, 1/3) , (-3, -1, -1/3) , ( 3, -2, 1/9) , (-3, -2, 1/9) , ( 3, -3, 1/27) , (-3, -3, -1/27) ]; void [test ((^), values) | values = cases];