From 0c2d74020a925fa86235ae7c716aa0ede856e6e6 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 23:31:53 +0800 Subject: Add more superclass tests --- test/t/float.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'test/t/float.rb') diff --git a/test/t/float.rb b/test/t/float.rb index fc87a5b22..5c5245c73 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -5,6 +5,10 @@ assert('Float', '15.2.9') do Float.class == Class end +assert('Float superclass', '15.2.9.2') do + Float.superclass == Numeric +end + assert('Float#+', '15.2.9.3.1') do a = 3.123456788 + 0.000000001 b = 3.123456789 + 1 -- cgit v1.2.3 From 9dd3ac36d1ae16fffb1902e9d459c1bf9aec86a4 Mon Sep 17 00:00:00 2001 From: Akira Kuroda Date: Sun, 22 Jul 2012 21:06:38 +0900 Subject: add test cases for floor, inifinite?, truncate, ceil, and round --- test/t/float.rb | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'test/t/float.rb') diff --git a/test/t/float.rb b/test/t/float.rb index 5c5245c73..30b470272 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -65,7 +65,11 @@ assert('Float#==', '15.2.9.3.7') do end assert('Float#ceil', '15.2.9.3.8') do - 3.123456789.ceil == 4 + a = 3.123456789.ceil + b = 3.0.ceil + c = -3.123456789.ceil + d = -3.0.ceil + a == 4 and b == 3 and c == -3 and d == -3 end assert('Float#finite?', '15.2.9.3.9') do @@ -74,20 +78,34 @@ assert('Float#finite?', '15.2.9.3.9') do end assert('Float#floor', '15.2.9.3.10') do - 3.123456789.floor == 3 + a = 3.123456789.floor + b = 3.0.floor + c = -3.123456789.floor + d = -3.0.floor + a == 3 and b == 3 and c == -4 and d == -3 end assert('Float#infinite?', '15.2.9.3.11') do - not 3.123456789.infinite? and - (1.0 / 0.0).infinite? + a = 3.123456789.infinite? + b = (1.0 / 0.0).infinite? + c = (-1.0 / 0.0).infinite? + + a == nil and b == 1 and c == -1 end assert('Float#round', '15.2.9.3.12') do a = 3.123456789.round b = 3.5.round c = 3.499999999.round + d = (-3.123456789).round + e = (-3.5).round + f = 12345.67.round(-1) + g = 3.123456789.round(0) + h = 3.123456789.round(1) + i = 3.123456789.round(4) - a == 3 and b == 4 and c == 3 + a == 3 and b == 4 and c == 3 and d == -3 and e == -4 and + f == 12350 and g == 3 and h == 3.1 and i == 3.1235 end assert('Float#to_f', '15.2.9.3.13') do @@ -101,5 +119,5 @@ assert('Float#to_i', '15.2.9.3.14') do end assert('Float#truncate', '15.2.9.3.15') do - 3.123456789.truncate == 3 + 3.123456789.truncate == 3 and -3.1.truncate == -3 end -- cgit v1.2.3 From 0270d11c81c28a5616eebd64d10be5133de4d7a0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 00:45:12 +0900 Subject: float do not have enough precision to round if MRB_USE_FLOAT is set --- src/numeric.c | 27 ++++++++++++++------------- test/t/float.rb | 34 +++++++++++++++++----------------- 2 files changed, 31 insertions(+), 30 deletions(-) (limited to 'test/t/float.rb') diff --git a/src/numeric.c b/src/numeric.c index d294597ee..012e69741 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -195,7 +195,11 @@ flo_to_s(mrb_state *mrb, mrb_value flt) } else if(isnan(value)) return mrb_str_new(mrb, "NaN", 3); +#ifdef MRB_USE_FLOAT + n = sprintf(buf, "%.7g", value); +#else n = sprintf(buf, "%.14g", value); +#endif assert(n >= 0); return mrb_str_new(mrb, buf, n); } @@ -511,21 +515,13 @@ flo_ceil(mrb_state *mrb, mrb_value num) */ static mrb_value -flo_round(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value num) +flo_round(mrb_state *mrb, mrb_value num) { - mrb_value nd; - mrb_float number, f; + double number, f; int ndigits = 0, i; - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - if (argc == 1) { - nd = argv[0]; - ndigits = mrb_fixnum(nd); - } - number = mrb_float(num); + mrb_get_args(mrb, "|i", &ndigits); + number = mrb_float(num); f = 1.0; i = abs(ndigits); while (--i >= 0) @@ -535,7 +531,7 @@ flo_round(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value num) if (ndigits < 0) number = 0; } else { - mrb_float d; + double d; if (ndigits < 0) number /= f; else number *= f; @@ -554,6 +550,11 @@ flo_round(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value num) else number /= f; } + { + mrb_value ff = mrb_float_value(number); + + printf("%f.round(%d) = %f\n", mrb_float(num), ndigits, mrb_float(ff)); + } if (ndigits > 0) return mrb_float_value(number); return mrb_fixnum_value((mrb_int)number); } diff --git a/test/t/float.rb b/test/t/float.rb index 30b470272..e2c139c03 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -26,11 +26,11 @@ assert('Float#-', '15.2.9.3.2') do end assert('Float#*', '15.2.9.3.3') do - a = 3.123456789 * 3.123456789 - b = 3.123456789 * 1 + a = 3.125 * 3.125 + b = 3.125 * 1 - check_float(a, 9.75598231275019) and - check_float(b, 3.123456789) + check_float(a, 9.765625) and + check_float(b, 3.125) end assert('Float#/', '15.2.9.3.4') do @@ -42,19 +42,19 @@ assert('Float#/', '15.2.9.3.4') do end assert('Float#%', '15.2.9.3.5') do - a = 3.123456789 % 3.123456789 - b = 3.123456789 % 1 + a = 3.125 % 3.125 + b = 3.125 % 1 check_float(a, 0.0) and - check_float(b, 0.123456789) + check_float(b, 0.125) end assert('Float#<=>', '15.2.9.3.6') do - a = 3.123456789 <=> 3.123456788 - b = 3.123456789 <=> 3.123456789 - c = 3.123456789 <=> 3.123456790 - a2 = 3.123456789 <=> 3 - c2 = 3.123456789 <=> 4 + a = 3.125 <=> 3.123 + b = 3.125 <=> 3.125 + c = 3.125 <=> 3.126 + a2 = 3.125 <=> 3 + c2 = 3.125 <=> 4 a == 1 and b == 0 and c == -1 and a2 == 1 and c2 == -1 @@ -96,16 +96,16 @@ end assert('Float#round', '15.2.9.3.12') do a = 3.123456789.round b = 3.5.round - c = 3.499999999.round + c = 3.4999.round d = (-3.123456789).round e = (-3.5).round f = 12345.67.round(-1) - g = 3.123456789.round(0) - h = 3.123456789.round(1) - i = 3.123456789.round(4) + g = 3.423456789.round(0) + h = 3.423456789.round(1) + i = 3.423456789.round(3) a == 3 and b == 4 and c == 3 and d == -3 and e == -4 and - f == 12350 and g == 3 and h == 3.1 and i == 3.1235 + f == 12350 and g == 3 and h == 3.4 and i == 3.423 end assert('Float#to_f', '15.2.9.3.13') do -- cgit v1.2.3