Changeset 8054

Show
Ignore:
Timestamp:
12/03/05 07:06:08 (3 years ago)
Author:
luqui
svk:copy_cache_prev:
10519
Message:

Added tests about infinity, and "fixed" op2Exp to make them pass. They should
be checked for correctness.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim/Numeric.hs

    r7579 r8054  
    6161            if isDigit . head $ show (num1 :: VNum) 
    6262                then op2Rat ((^^) :: VRat -> VInt -> VRat) x y 
    63                 else op2Num ((**) :: VNum -> VNum -> VNum) x y 
    64         _ -> op2Num ((**) :: VNum -> VNum -> VNum) x y 
     63                else op2Num numExp x y 
     64        _ -> op2Num numExp x y 
     65    where 
     66    numExp :: VNum -> VNum -> VNum 
     67    -- Perl 6 differs from Haskell in the floating point spec wrt Infinity and NaN 
     68    numExp x y  
     69        | x == 1/0 && y == 0                           = 0/0 
     70        | x == 0  && y < 0                             = 0/0 
     71        | y == 1/0 && (x == 1 || x <= -1)              = 0/0  
     72        | y == -1/0 && (x == 1 || (x >= -1 && x <= 0)) = 0/0  
     73        | otherwise                                    = x ** y 
    6574 
    6675op2Divide :: Val -> Val -> Eval Val 
     
    7786    = op2Num (/) x y 
    7887    where 
    79     err = fail "Illegal division by zero" 
     88    err = fail "Illegal division by zero"  -- XXX why not NaN? 
    8089 
    8190op2Modulus :: Val -> Val -> Eval Val 
  • t/operators/arith.t

    r7792 r8054  
    44use Test; 
    55 
    6 plan 185; 
     6plan 196; 
    77 
    88my $five = abs(-5); 
     
    311311is Inf/Inf, NaN; 
    312312is Inf*Inf/Inf, NaN; 
    313 is Inf**0, 1; 
    314313is 0**Inf, 0; 
    315314 
     
    324323is 0.9**Inf, 0,   "0.9**Inf converges towards 0"; 
    325324is 1.1**Inf, Inf, "1.1**Inf diverges towards Inf"; 
    326 is 1**Inf, 1 , :todo("1**Inf == 1"); 
     325# this next one is arguable 
     326is 1**Inf, NaN,   "1**Inf depends on the functions in the limit (unless 1 is considered an int)"; 
     327# but this next one isn't 
     328is 1.0**Inf, NaN, "1.0**Inf depends on the functions in the limit"; 
     329is (-1)**Inf, NaN, "(-1)**Inf is indeterminate for the same reason"; 
     330is (-1.1)**Inf, NaN, "(-2)**Inf is indeterminate between -Inf and Inf"; 
     331is (-0.9)**Inf, 0, "(-0.9)**Inf oscillates but always converges to 0"; 
     332 
     333is 0.9**(-Inf), Inf, "0.9**-Inf diverges towards Inf"; 
     334is 1.1**(-Inf), 0,   "1.1**-Inf converges to 0"; 
     335is 1**(-Inf), NaN, "1**Inf depends on the functions in the limit"; 
     336is 1.0**(-Inf), NaN, "1.0**Inf depends on the functions in the limit"; 
     337is (-1)**(-Inf), NaN, "(-1)**-Inf is indeterminate"; 
     338is (-1.1)**(-Inf), 0, "(-1.1)**-Inf converges to 0"; 
     339is (-0.9)**(-Inf), NaN, "(0.9)**-Inf oscillates and diverges"; 
     340 
     341is Inf**0, NaN; 
    327342 
    328343#fail("1**Inf is platform-specific -- it's 1 on OSX and NaN elsewhere", :todo);