Changeset 4532


Ignore:
Timestamp:
10/25/03 18:55:08 (18 years ago)
Author:
dmcnaught
Message:

'log' now supports negative and complex args.

File:
1 edited

Legend:

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

    r4528 r4532  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.482 2003-10-24 20:30:57 piso Exp $
     5 * $Id: Primitives.java,v 1.483 2003-10-25 18:55:08 dmcnaught Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    44984498    };
    44994499
    4500     private static final LispFloat log(LispObject obj) throws ConditionThrowable
    4501     {
    4502         if (obj instanceof Fixnum)
    4503             return new LispFloat(Math.log(((Fixnum)obj).getValue()));
    4504         if (obj instanceof Bignum)
    4505             return new LispFloat(Math.log(((Bignum)obj).floatValue()));
    4506         if (obj instanceof Ratio)
    4507             return new LispFloat(Math.log(((Ratio)obj).floatValue()));
    4508         if (obj instanceof LispFloat)
    4509             return new LispFloat(Math.log(((LispFloat)obj).getValue()));
     4500    private static final LispObject log(LispObject obj) throws ConditionThrowable
     4501    {
     4502        if (obj.realp() && !obj.minusp()) {  // real value
     4503            if (obj instanceof Fixnum)
     4504                return new LispFloat(Math.log(((Fixnum)obj).getValue()));
     4505            if (obj instanceof Bignum)
     4506                return new LispFloat(Math.log(((Bignum)obj).floatValue()));
     4507            if (obj instanceof Ratio)
     4508                return new LispFloat(Math.log(((Ratio)obj).floatValue()));
     4509            if (obj instanceof LispFloat)
     4510                return new LispFloat(Math.log(((LispFloat)obj).getValue()));
     4511        } else { // returning Complex
     4512            LispFloat re, im, phase, abs;
     4513            if (obj.realp() && obj.minusp()) {
     4514                re = LispFloat.coerceToFloat(obj);
     4515                abs = new LispFloat(Math.abs(re.getValue()));
     4516                phase = new LispFloat(Math.PI);
     4517                return Complex.getInstance(new LispFloat(Math.log(abs.getValue())), phase);
     4518            } else if (obj instanceof Complex) {
     4519                re = LispFloat.coerceToFloat(((Complex)obj).getRealPart());
     4520                im = LispFloat.coerceToFloat(((Complex)obj).getImaginaryPart());
     4521                phase = new LispFloat(Math.atan2(im.getValue(), re.getValue()));  // atan(y/x)
     4522                abs = (LispFloat)((Complex)obj).ABS();
     4523                return Complex.getInstance(new LispFloat(Math.log(abs.getValue())), phase);
     4524            }           
     4525        }
     4526           
    45104527        throw new ConditionThrowable(new TypeError(obj, "number"));
    45114528    }
Note: See TracChangeset for help on using the changeset viewer.