diff options
| -rw-r--r-- | src/numeric.c | 5 | ||||
| -rw-r--r-- | test/t/float.rb | 66 |
2 files changed, 59 insertions, 12 deletions
diff --git a/src/numeric.c b/src/numeric.c index 51137d45b..c536f0614 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -25,7 +25,6 @@ #define floor(f) floorf(f) #define ceil(f) ceilf(f) #define fmod(x,y) fmodf(x,y) -#define copysign(x,y) copysignf(x,y) #define FLO_TO_STR_PREC 8 #else #define FLO_TO_STR_PREC 16 @@ -245,9 +244,7 @@ mrb_num_div_flo(mrb_state *mrb, mrb_float x, mrb_float y) return NAN; } else { - mrb_float a = copysign(1.0, x); - mrb_float b = copysign(1.0, y); - return a * b * INFINITY; + return x * (signbit(y) ? -1.0 : 1.0) * INFINITY; } } diff --git a/test/t/float.rb b/test/t/float.rb index 3a0cf27bc..f6f6d01dd 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -35,16 +35,66 @@ assert('Float#*', '15.2.9.3.3') do end assert('Float#/', '15.2.9.3.4') do - a = 3.123456789 / 3.123456789 - b = 3.123456789 / 1 - - assert_float(1.0 , a) - assert_float(3.123456789, b) + assert_float(1.0, 3.123456789 / 3.123456789) + assert_float(3.123456789, 3.123456789 / 1) + assert_float(2.875, -5.75 / -2.0) + assert_float(-2.875, 5.75 / -2) + assert_float(-2.875, -5.75 / 2.0) + assert_float(Float::NAN, 0.0 / 0.0) + assert_float(Float::NAN, -0.0 / -0.0) + assert_float(Float::NAN, -0.0 / 0.0) + assert_float(Float::NAN, Float::NAN / Float::NAN) + assert_float(Float::NAN, Float::NAN / 0.0) + assert_float(Float::NAN, Float::NAN / -0.0) + assert_float(Float::NAN, Float::NAN / 2.0) + assert_float(Float::NAN, Float::NAN / -2.0) + assert_float(Float::NAN, 0.0 / Float::NAN) + assert_float(Float::NAN, -0.0 / Float::NAN) + assert_float(Float::NAN, 2.0 / Float::NAN) + assert_float(Float::NAN, -2.0 / Float::NAN) + assert_float(Float::NAN, Float::INFINITY / Float::INFINITY) + assert_float(Float::NAN, -Float::INFINITY / Float::INFINITY) + assert_float(Float::NAN, Float::INFINITY / -Float::INFINITY) + assert_float(Float::NAN, -Float::INFINITY / -Float::INFINITY) + assert_float(Float::INFINITY, 1.0 / 0.0) + assert_float(Float::INFINITY, -1.0 / -0.0) + assert_float(-Float::INFINITY, 1.0 / -0.0) + assert_float(-Float::INFINITY, -1.0 / 0.0) + assert_float(0.0, 1.0 / Float::INFINITY) + assert_float(0.0, -1.0 / -Float::INFINITY) + assert_float(-0.0, -1.0 / Float::INFINITY) + assert_float(-0.0, 1.0 / -Float::INFINITY) end assert('Float#quo') do - a = 3.123456789.quo(3.123456789) - - assert_float(1.0 , a) + assert_float(1.0, 3.123456789.quo(3.123456789)) + assert_float(3.123456789, 3.123456789.quo(1)) + assert_float(2.875, -5.75.quo(-2.0)) + assert_float(-2.875, 5.75.quo(-2)) + assert_float(-2.875, -5.75.quo(2.0)) + assert_float(Float::NAN, 0.0.quo(0.0)) + assert_float(Float::NAN, -0.0.quo(-0.0)) + assert_float(Float::NAN, -0.0.quo(0.0)) + assert_float(Float::NAN, Float::NAN.quo(Float::NAN)) + assert_float(Float::NAN, Float::NAN.quo(0.0)) + assert_float(Float::NAN, Float::NAN.quo(-0.0)) + assert_float(Float::NAN, Float::NAN.quo(2.0)) + assert_float(Float::NAN, Float::NAN.quo(-2.0)) + assert_float(Float::NAN, 0.0.quo(Float::NAN)) + assert_float(Float::NAN, -0.0.quo(Float::NAN)) + assert_float(Float::NAN, 2.0.quo(Float::NAN)) + assert_float(Float::NAN, -2.0.quo(Float::NAN)) + assert_float(Float::NAN, Float::INFINITY.quo(Float::INFINITY)) + assert_float(Float::NAN, -Float::INFINITY.quo(Float::INFINITY)) + assert_float(Float::NAN, Float::INFINITY.quo(-Float::INFINITY)) + assert_float(Float::NAN, -Float::INFINITY.quo(-Float::INFINITY)) + assert_float(Float::INFINITY, 1.0.quo(0.0)) + assert_float(Float::INFINITY, -1.0.quo(-0.0)) + assert_float(-Float::INFINITY, 1.0.quo(-0.0)) + assert_float(-Float::INFINITY, -1.0.quo(0.0)) + assert_float(0.0, 1.0.quo(Float::INFINITY)) + assert_float(0.0, -1.0.quo(-Float::INFINITY)) + assert_float(-0.0, -1.0.quo(Float::INFINITY)) + assert_float(-0.0, 1.0.quo(-Float::INFINITY)) end assert('Float#%', '15.2.9.3.5') do |
