Show
Ignore:
Timestamp:
02/06/07 21:41:12 (22 months ago)
Author:
audreyt
Message:

* Implement ** for imaginary numbers. The check for **0 isn't

quite right yet (makes **1i considered 0 also) -- fixes welcome!

Files:
1 modified

Legend:

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

    r15201 r15202  
    3737        y' <- fromVal y 
    3838        return . castV $ f x' y' 
     39 
     40op2Floating :: (forall a. (Floating a) => a -> a -> a) -> Val -> Val -> Eval Val 
     41op2Floating f x y 
     42    | VUndef <- x = op2Floating f (VInt 0) y 
     43    | VUndef <- y = op2Floating f x (VInt 0) 
     44    | VType{} <- x = op2Floating f (VInt 0) y 
     45    | VType{} <- y = op2Floating f x (VInt 0) 
     46    | VRef r <- x = do 
     47        x' <- readRef r 
     48        op2Floating f x' y 
     49    | VRef r <- y = do 
     50        y' <- readRef r 
     51        op2Floating f x y' 
     52    | VComplex x' <- x = do 
     53        y'  <- fromVal y 
     54        return . VComplex $ f x' y' 
     55    | VComplex y' <- y = do 
     56        x'  <- fromVal x 
     57        return . VComplex $ f x' y' 
     58    | otherwise = do 
     59        x' <- fromVal x 
     60        y' <- fromVal y 
     61        return . VNum $ f x' y' 
    3962 
    4063op2Numeric :: (forall a. (Num a) => a -> a -> a) -> Val -> Val -> Eval Val 
     
    103126            if isDigit . head $ show (num1 :: VNum) 
    104127                then op2Rat ((^^) :: VRat -> VInt -> VRat) x y 
    105                 else op2Num (**) x y 
    106         _ -> op2Num (**) x y 
     128                else op2Floating (**) x y 
     129        _ -> op2Floating (**) x y 
    107130 
    108131op2Divide :: Val -> Val -> Eval Val