88 lines
2.7 KiB
Groovy
88 lines
2.7 KiB
Groovy
Number.metaClass.mixin RationalCategory
|
||
|
||
def x = [5, 20] as Rational
|
||
def y = [9, 12] as Rational
|
||
def z = [0, 10000] as Rational
|
||
|
||
println x
|
||
println y
|
||
println z
|
||
println (x <=> y)
|
||
println (x.compareTo(y))
|
||
assert x < y
|
||
assert x*3 == y
|
||
assert x*5.5 == 5.5*x
|
||
assert (z + 1) <= y*4
|
||
assert x + 1.3 == 1.3 + x
|
||
assert 24 - y == -(y - 24)
|
||
assert 3 / y == (y / 3).reciprocal()
|
||
assert x != y
|
||
|
||
println "x + y == ${x} + ${y} == ${x + y}"
|
||
println "x + z == ${x} + ${z} == ${x + z}"
|
||
println "x - y == ${x} - ${y} == ${x - y}"
|
||
println "x - z == ${x} - ${z} == ${x - z}"
|
||
println "x * y == ${x} * ${y} == ${x * y}"
|
||
println "y ** 3 == ${y} ** 3 == ${y ** 3}"
|
||
println "y ** -3 == ${y} ** -3 == ${y ** -3}"
|
||
println "x * z == ${x} * ${z} == ${x * z}"
|
||
println "x / y == ${x} / ${y} == ${x / y}"
|
||
try { print "x / z == ${x} / ${z} == "; println "${x / z}" }
|
||
catch (Throwable t) { println t.message }
|
||
|
||
println "-x == -${x} == ${-x}"
|
||
println "-y == -${y} == ${-y}"
|
||
println "-z == -${z} == ${-z}"
|
||
|
||
print "x as int == ${x} as int == "; println x.intValue()
|
||
print "x as double == ${x} as double == "; println x.doubleValue()
|
||
print "1 / x as int == 1 / ${x} as int == "; println x.reciprocal().intValue()
|
||
print "1.0 / x == 1.0 / ${x} == "; println x.reciprocal().doubleValue()
|
||
print "y as int == ${y} as int == "; println y.intValue()
|
||
print "y as double == ${y} as double == "; println y.doubleValue()
|
||
print "1 / y as int == 1 / ${y} as int == "; println y.reciprocal().intValue()
|
||
print "1.0 / y == 1.0 / ${y} == "; println y.reciprocal().doubleValue()
|
||
print "z as int == ${z} as int == "; println z.intValue()
|
||
print "z as double == ${z} as double == "; println z.doubleValue()
|
||
try { print "1 / z as int == 1 / ${z} as int == "; println z.reciprocal().intValue() }
|
||
catch (Throwable t) { println t.message }
|
||
try { print "1.0 / z == 1.0 / ${z} == "; println z.reciprocal().doubleValue() }
|
||
catch (Throwable t) { println t.message }
|
||
|
||
println "++x == ++ ${x} == ${++x}"
|
||
println "++y == ++ ${y} == ${++y}"
|
||
println "++z == ++ ${z} == ${++z}"
|
||
println "-- --x == -- -- ${x} == ${-- (--x)}"
|
||
println "-- --y == -- -- ${y} == ${-- (--y)}"
|
||
println "-- --z == -- -- ${z} == ${-- (--z)}"
|
||
println x
|
||
println y
|
||
println z
|
||
|
||
println (x <=> y)
|
||
assert x*3 == y
|
||
assert (z + 1) <= y*4
|
||
assert (x < y)
|
||
|
||
println 25 as Rational
|
||
println 25.0 as Rational
|
||
println 0.25 as Rational
|
||
|
||
def ε = 0.000000001 // tolerance (epsilon): acceptable "wrongness" to account for rounding error
|
||
|
||
def π = Math.PI
|
||
def α = π as Rational
|
||
assert (π - (α as BigDecimal)).abs() < ε
|
||
println π
|
||
println α
|
||
println (α.toBigDecimal())
|
||
println (α as BigDecimal)
|
||
println (α as Double)
|
||
println (α as double)
|
||
println (α as boolean)
|
||
println (z as boolean)
|
||
try { println (α as Date) }
|
||
catch (Throwable t) { println t.message }
|
||
try { println (α as char) }
|
||
catch (Throwable t) { println t.message }
|