# Copyright 2005-2009 Kevin Reid, under the terms of the MIT X license # found at http://www.opensource.org/licenses/mit-license.html ................ ? 44.previous() # value: 43 ? 44.next() # value: 45 ? 253.min(18) # value: 18 ? 33 :DeepFrozen # value: 33 ? 38823752358143578936745893267458923047892347891234789324 :DeepFrozen # value: 38823752358143578936745893267458923047892347891234789324 ? 1.0 :DeepFrozen # value: 1.0 ? 1.0.isNaN() # value: false ? 0.isNaN() # value: false ? NaN.isNaN() # value: true ? Infinity.isNaN() # value: false ? 1.isNaN() # value: false ? (1/0).isNaN() # value: false ? (0/0).isNaN() # value: true ? 0.5.floor() # value: 0 ? 1.0.floor() # value: 1 ? 0.999.floor() # value: 0 ? (-0.25).floor() # value: -1 ? 5.floor() # value: 5 approxDivide (by zero), and print of funny floats ? [-1 / 0, 0 / 0, 1 / 0] # value: [-Infinity, NaN, Infinity] ? [-1.0 / 0, 0.0 / 0, 1.0 / 0] # value: [-Infinity, NaN, Infinity] ? [-1 / 0.0, 0 / 0.0, 1 / 0.0] # value: [-Infinity, NaN, Infinity] ? [-1.0 / 0.0, 0.0 / 0.0, 1.0 / 0.0] # value: [-Infinity, NaN, Infinity] Division variations ? for i in -5..5 { print(i.approxDivide(3), " ") } # stdout: -1.6666666666666667 -1.3333333333333333 -1.0 -0.6666666666666666 -0.3333333333333333 0.0 0.3333333333333333 0.6666666666666666 1.0 1.3333333333333333 1.6666666666666667 ? for i in -5..5 { print(i.floorDivide(3), " ") } # stdout: -2 -2 -1 -1 -1 0 0 0 1 1 1 ? for i in -5..5 { print(i.ceilDivide(3), " ") } # stdout: -1 -1 -1 0 0 0 1 1 1 2 2 ? for i in -5..5 { print(i.truncDivide(3), " ") } # stdout: -1 -1 -1 0 0 0 0 0 1 1 1 Exponentiation ? 2 ** 16 # value: 65536 ? 3 ** 3 # value: 27 ? 2**32 # value: 4294967296 ? 2 ** -1 # value: 1/2 ? 2 ** -1.0 # value: 0.5 ? 2.0 ** -1 # value: 0.5 ? 2.0 ** -2 # value: 0.25 ? def x := 2.0 ** -0.5 # value: 0.7071067811865475 ? e__quasiParser(E.toQuote(x)).eval(safeScope) - x # value: 0.0 ? 2.0 ** 0.5 # value: 1.4142135623730951 modPow ? e`(1) ** (2) %% (3)`.asKernelE() # value: e`1.modPow(2, 3)` ? 2 ** 16 %% (2 ** 16) # value: 0 ? 2 ** 17 %% (2 ** 16 - 1) # value: 2 ? 3 ** 3 %% 37 # value: 27 ? 3 ** 3 %% 10 # value: 7 ? (-3) ** 3 %% 10 # value: 3 XXX test this a little more systematically Coercion tests XXX stricter version that checks the guard passed to conformTo ? def like(v) :any { return def conformer { to __conformTo(_) :any { return v }}} # value: ? 1 / like(2) # value: 0.5 ? 1 / like(0) # value: Infinity ? 1 + like(2) # value: 3 ? 1 - like(2) # value: -1 ? 3 * like(5) # value: 15 ? 3.min(like(2)) # value: 2 ? 1.min(like(2)) # value: 1 ? 3.max(like(4)) # value: 4 ? -3 // like(2) # value: -2 ? (-3).truncDivide(like(2)) # value: -1 ? (-3).ceilDivide(like(2)) # value: -1 ? 53 % like(10) # value: 3 ? 53 %% like(10) # value: 3 ? 0 <=> like(0.0) # value: true ? 3 ** like(3) # value: 27 Number formatting XXX Does E-on-Java have any non-base-10 print operation? ? 99.toString() # value: "99" ? 99.toString([].asMap()) # value: "99" ? 99.toString(["base" => 2]) # value: "1100011" ? 99.toString(["base" => 16]) # value: "63" ? 254.toString(["base" => 16]) # value: "fe" ? 99.toString(["base" => 37]) # problem: base must be in 2..36, not 37 ? 99.toString(["base" => 1]) # problem: base must be in 2..36, not 1 ? 99.toString(["base" => like(10)]) # value: "99" Integer coercion ? float64.coerce(1, throw) # value: 1.0 ? 1.__conformTo(any) # value: 1 ? 1.__conformTo(nullOk) # value: 1 Bug: integer's __conformTo would infintely recurse given a typical non-native guard ' ? List.coerce(1, throw) # problem: the int 1 doesn't coerce to a List floor, ceil ? def fc(n) :any { return [n.floor(), n.ceil()] }; null ? fc(1) # value: [1, 1] ? fc(1.0) # value: [1, 1] ? fc(1.5) # value: [1, 2] ? fc(-1.5) # value: [-2, -1] Float comparison ? NaN.op__cmp(NaN) # value: NaN ? NaN.op__cmp(1.0) # value: NaN ? 1.0.op__cmp(1.1) # value: -1.0 ? 1.0.op__cmp(0.9) # value: 1.0 ? (-1.0).op__cmp(-0.9) # value: -1.0 ? (-0.0).op__cmp(0.0) # value: 0.0 Float parsing ? def makeFloat64 := # value: ? makeFloat64("1") # value: 1.0 ? makeFloat64("-1") # value: -1.0 ? makeFloat64("+1") # value: 1.0 ? makeFloat64("NaN") # value: NaN ? makeFloat64(".1") # value: 0.1 ? makeFloat64(".") # value: 0.0 XXX should the above fail? ? makeFloat64("0.") # value: 0.0 ? makeFloat64("-NaN") # value: NaN ? makeFloat64("-.1") # value: -0.1 ? makeFloat64("-.") # value: -0.0 XXX should the above fail? ? makeFloat64("-0.") # value: -0.0 ? makeFloat64("0.9999999999999999") # value: 0.9999999999999999 ? makeFloat64("0.99999999999999999") # value: 1.0 ? makeFloat64("Infinity") # value: Infinity ? makeFloat64("-Infinity") # value: -Infinity ? makeFloat64("Inf") # problem: ? makeFloat64("Irgle") # problem: XXX the above errors are not pretty signum ? 1.signum() # value: 1 ? 2.signum() # value: 1 ? 23984092348790.signum() # value: 1 ? (-1).signum() # value: -1 ? (-2).signum() # value: -1 ? (-23984092348790).signum() # value: -1 ? 0.signum() # value: 0 XXX EoJ does not have floating-point signum -- why? ? 0.0.signum() # value: 0.0 ? (-0.0).signum() # value: -0.0 ? 0.1412.signum() # value: 1.0 ? 1.0.signum() # value: 1.0 ? 2.0.signum() # value: 1.0 ? 23984092348790.0.signum() # value: 1.0 ? (-0.1412).signum() # value: -1.0 ? (-1.0).signum() # value: -1.0 ? (-2.0).signum() # value: -1.0 ? (-23984092348790.0).signum() # value: -1.0 Bug test by dash: the internal float64 type was not a class, and this would throw ? 1.0.__getAllegedType().getMessageTypes().size() > 0 # value: true