Changeset 8629


Ignore:
Timestamp:
02/23/05 16:30:53 (16 years ago)
Author:
piso
Message:

multiplyBy(), divideBy(): support complex argument.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Ratio.java

    r7968 r8629  
    22 * Ratio.java
    33 *
    4  * Copyright (C) 2003-2004 Peter Graves
    5  * $Id: Ratio.java,v 1.47 2004-10-13 00:22:19 piso Exp $
     4 * Copyright (C) 2003-2005 Peter Graves
     5 * $Id: Ratio.java,v 1.48 2005-02-23 16:30:53 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    105105            return true;
    106106        if (obj instanceof Ratio) {
    107             return numerator.equals(((Ratio)obj).numerator) &&
    108                 denominator.equals(((Ratio)obj).denominator);
     107            return (numerator.equals(((Ratio)obj).numerator) &&
     108                    denominator.equals(((Ratio)obj).denominator));
    109109        }
    110110        return false;
     
    225225            return Complex.getInstance(add(c.getRealPart()), c.getImaginaryPart());
    226226        }
    227         return signal(new TypeError(obj, "number"));
     227        return signal(new TypeError(obj, Symbol.NUMBER));
    228228    }
    229229
     
    257257                                       Fixnum.ZERO.subtract(c.getImaginaryPart()));
    258258        }
    259         return signal(new TypeError(obj, "number"));
     259        return signal(new TypeError(obj, Symbol.NUMBER));
    260260    }
    261261
     
    278278            return new LispFloat(floatValue() * ((LispFloat)obj).getValue());
    279279        }
    280         return signal(new TypeError(obj, "number"));
     280        if (obj instanceof Complex) {
     281            Complex c = (Complex) obj;
     282            return Complex.getInstance(multiplyBy(c.getRealPart()),
     283                                       multiplyBy(c.getImaginaryPart()));
     284        }
     285        return signal(new TypeError(obj, Symbol.NUMBER));
    281286    }
    282287
     
    301306            return new LispFloat(floatValue() / ((LispFloat)obj).getValue());
    302307        }
    303         return signal(new TypeError(obj, "number"));
     308        if (obj instanceof Complex) {
     309            Complex c = (Complex) obj;
     310            // numerator
     311            LispObject realPart = this.multiplyBy(c.getRealPart());
     312            LispObject imagPart =
     313                Fixnum.ZERO.subtract(this).multiplyBy(c.getImaginaryPart());
     314            // denominator
     315            LispObject d =
     316                c.getRealPart().multiplyBy(c.getRealPart());
     317            d = d.add(c.getImaginaryPart().multiplyBy(c.getImaginaryPart()));
     318            return Complex.getInstance(realPart.divideBy(d),
     319                                       imagPart.divideBy(d));
     320        }
     321        return signal(new TypeError(obj, Symbol.NUMBER));
    304322    }
    305323
     
    313331        if (obj.numberp())
    314332            return false;
    315         signal(new TypeError(obj, "number"));
     333        signal(new TypeError(obj, Symbol.NUMBER));
    316334        // Not reached.
    317335        return false;
     
    427445            d = ((Ratio)obj).denominator();
    428446    } else {
    429             return signal(new TypeError(obj, "number"));
     447            return signal(new TypeError(obj, Symbol.NUMBER));
    430448    }
    431449    // Invert and multiply.
Note: See TracChangeset for help on using the changeset viewer.