Backport #2349 ยป bigdec.diff
ext/bigdecimal/bigdecimal.c | ||
---|---|---|
switch(op)
|
||
{
|
||
case '*': f = rb_intern("<=>");break;
|
||
case '=': f = rb_intern("=="); break;
|
||
case '!': f = rb_intern("!="); break;
|
||
case '*': return rb_num_coerce_cmp(self,r,rb_intern("<=>"));
|
||
case '=': return RTEST(rb_num_coerce_cmp(self,r,rb_intern("=="))) ? Qtrue : Qfalse;
|
||
case 'G': f = rb_intern(">="); break;
|
||
case 'L': f = rb_intern("<="); break;
|
||
case '>': case '<': f = (ID)op; break;
|
||
}
|
||
return rb_num_coerce_cmp(self,r,f);
|
||
return rb_num_coerce_relop(self,r,f);
|
||
}
|
||
SAVE(b);
|
||
e = VpComp(a, b);
|
||
if(e==999) return Qnil;
|
||
if(e==999) return (op == '*') ? Qnil : Qfalse;
|
||
switch(op)
|
||
{
|
||
case '*': return INT2FIX(e); /* any op */
|
||
case '=': if(e==0) return Qtrue ; return Qfalse;
|
||
case '!': if(e!=0) return Qtrue ; return Qfalse;
|
||
case 'G': if(e>=0) return Qtrue ; return Qfalse;
|
||
case '>': if(e> 0) return Qtrue ; return Qfalse;
|
||
case 'L': if(e<=0) return Qtrue ; return Qfalse;
|
test/bigdecimal/test_bigdecimal.rb | ||
---|---|---|
x = BigDecimal.new("0.1")
|
||
100.times do
|
||
x *= x
|
||
break if x == false
|
||
end
|
||
end
|
||
end
|
||
... | ... | |
x = BigDecimal.new("10")
|
||
100.times do
|
||
x *= x
|
||
break if x == false
|
||
end
|
||
end
|
||
end
|
||
... | ... | |
assert_operator(1, :<, inf)
|
||
end
|
||
def test_cmp_corece
|
||
def test_cmp_nan
|
||
n1 = BigDecimal.new("1")
|
||
BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
|
||
assert_equal(nil, BigDecimal.new("NaN") <=> n1)
|
||
assert_equal(false, BigDecimal.new("NaN") > n1)
|
||
end
|
||
def test_cmp_failing_coercion
|
||
n1 = BigDecimal.new("1")
|
||
assert_equal(nil, n1 <=> nil)
|
||
assert_raise(ArgumentError){n1 > nil}
|
||
end
|
||
def test_cmp_coerce
|
||
n1 = BigDecimal.new("1")
|
||
n2 = BigDecimal.new("2")
|
||
o1 = Object.new; def o1.coerce(x); [x, BigDecimal.new("1")]; end
|