@@ -479,7 +479,12 @@ numRealPart badArgList = throwError $ NumArgs (Just 1) badArgList
479
479
480
480
-- | Retrieve imaginary part of a complex number
481
481
numImagPart :: [LispVal ] -> ThrowsError LispVal
482
- numImagPart [(Complex c)] = return $ Float $ imagPart c
482
+ numImagPart [(Complex c)] = do
483
+ let n = imagPart c
484
+ f = Float n
485
+ if isFloatAnInteger f
486
+ then return $ Number $ floor n
487
+ else return f
483
488
numImagPart [(Float _)] = return $ Number 0
484
489
numImagPart [(Rational _)] = return $ Number 0
485
490
numImagPart [(Number _)] = return $ Number 0
@@ -594,7 +599,13 @@ isReal :: [LispVal] -> ThrowsError LispVal
594
599
isReal ([Number _]) = return $ Bool True
595
600
isReal ([Rational _]) = return $ Bool True
596
601
isReal ([Float _]) = return $ Bool True
597
- isReal ([Complex c]) = return $ Bool $ (imagPart c) == 0
602
+ isReal ([Complex c]) = do
603
+ imagPt <- numImagPart [(Complex c)]
604
+ isExact <- isNumExact [imagPt]
605
+ isZero <- numBoolBinopEq [imagPt, (Number 0 )]
606
+ case (isExact, isZero) of
607
+ (Bool True , Bool True ) -> return $ Bool True
608
+ _ -> return $ Bool False
598
609
isReal _ = return $ Bool False
599
610
600
611
-- | Predicate to determine if given number is a rational.
0 commit comments