Changeset 8565


Ignore:
Timestamp:
02/14/05 04:04:57 (16 years ago)
Author:
piso
Message:

add(), multiplyBy()

File:
1 edited

Legend:

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

    r8519 r8565  
    33 *
    44 * Copyright (C) 2002-2005 Peter Graves
    5  * $Id: Fixnum.java,v 1.108 2005-02-10 01:55:30 piso Exp $
     5 * $Id: Fixnum.java,v 1.109 2005-02-14 04:04:57 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    308308    public LispObject add(LispObject obj) throws ConditionThrowable
    309309    {
    310         if (obj instanceof Fixnum)
    311             return number((long) value + ((Fixnum)obj).value);
     310        if (obj instanceof Fixnum) {
     311            long result = (long) value + ((Fixnum)obj).value;
     312            if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE)
     313                return new Fixnum((int)result);
     314            else
     315                return new Bignum(result);
     316        }
    312317        if (obj instanceof Bignum)
    313             return number(getBigInteger().add(Bignum.getValue(obj)));
     318            return number(getBigInteger().add(((Bignum)obj).value));
    314319        if (obj instanceof Ratio) {
    315320            BigInteger numerator = ((Ratio)obj).numerator();
    316321            BigInteger denominator = ((Ratio)obj).denominator();
    317             return number(
    318                 getBigInteger().multiply(denominator).add(numerator),
    319                 denominator);
     322            return number(getBigInteger().multiply(denominator).add(numerator),
     323                          denominator);
    320324        }
    321325        if (obj instanceof LispFloat)
     
    360364    }
    361365
     366    public LispObject multiplyBy(int n)
     367    {
     368        long result = (long) value * n;
     369        if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE)
     370            return new Fixnum((int)result);
     371        else
     372            return new Bignum(result);
     373    }
     374
    362375    public LispObject multiplyBy(LispObject obj) throws ConditionThrowable
    363376    {
    364         if (obj instanceof Fixnum)
    365             return number((long) value * ((Fixnum)obj).value);
     377        if (obj instanceof Fixnum) {
     378            long result = (long) value * ((Fixnum)obj).value;
     379            if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE)
     380                return new Fixnum((int)result);
     381            else
     382                return new Bignum(result);
     383        }
    366384        if (obj instanceof Bignum)
    367385            return number(getBigInteger().multiply(((Bignum)obj).value));
Note: See TracChangeset for help on using the changeset viewer.