Changeset 352:6cd2e6fcea83 in livinglogic.java.ul4

Show
Ignore:
Timestamp:
02/11/11 12:17:58 (8 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Fix floor division to round towards -infinity.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/src/com/livinglogic/ul4/Utils.java

    r351 r352  
    811811    public static Object floordiv(Object arg1, Object arg2) 
    812812    { 
     813        // integer division in UL4 is defined is rounding towords -infinity (as Python does) 
     814        // since Java rounds towards 0, the following code compensates for that 
    813815        if (arg1 instanceof Integer || arg1 instanceof Byte || arg1 instanceof Short || arg1 instanceof Boolean) 
    814816        { 
    815817            if (arg2 instanceof Integer || arg2 instanceof Byte || arg2 instanceof Short || arg2 instanceof Boolean) 
    816818            { 
    817                 // FIXME: Negative arguments don't work properly 
    818                 return _toInt(arg1) / _toInt(arg2); 
     819                int int1 = _toInt(arg1); 
     820                int int2 = _toInt(arg2); 
     821                if (int1 < 0) 
     822                { 
     823                    if (int2 < 0) 
     824                        return  int1 / int2; 
     825                    else 
     826                        return  (int1 - int2 + 1) / int2; 
     827                } 
     828                else 
     829                { 
     830                    if (int2 < 0) 
     831                        return  (int1 - int2 - 1) / int2; 
     832                    else 
     833                        return  int1 / int2; 
     834                } 
    819835            } 
    820836            else if (arg2 instanceof Long) 
    821                 return _toInt(arg1) / _toLong(arg2); 
     837            { 
     838                int int1 = _toInt(arg1); 
     839                int long2 = _toLong(arg2); 
     840                if (int1 < 0) 
     841                { 
     842                    if (long2 < 0) 
     843                        return  int1 / long2; 
     844                    else 
     845                        return  (int1 - long2 + 1) / long2; 
     846                } 
     847                else 
     848                { 
     849                    if (long2 < 0) 
     850                        return  (int1 - long2 - 1) / long2; 
     851                    else 
     852                        return  int1 / long2; 
     853                } 
     854            } 
    822855            else if (arg2 instanceof Float) 
    823856                return Math.floor(_toInt(arg1) / _toFloat(arg2));