JSBool /* ES5 15.8.2.15. */ js_math_round(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); if (args.length() == 0) { args.rval().setDouble(js_NaN); return true; } double x; if (!ToNumber(cx, args[0], &x)) return false; int32_t i; if (DoubleIsInt32(x, &i)) { args.rval().setInt32(i); return true; } /* Some numbers are so big that adding 0.5 would give the wrong number. */ if (ExponentComponent(x) >= 52) { args.rval().setNumber(x); return true; } args.rval().setNumber(js_copysign(floor(x + 0.5), x)); return true; }
float js::math_roundf_impl(float x) { int32_t ignored; if (NumberIsInt32(x, &ignored)) return x; /* Some numbers are so big that adding 0.5 would give the wrong number. */ if (ExponentComponent(x) >= int_fast16_t(FloatingPoint<float>::ExponentShift)) return x; return js_copysign(floorf(x + 0.5f), x); }
double js::math_round_impl(double x) { int32_t i; if (DoubleIsInt32(x, &i)) return double(i); /* Some numbers are so big that adding 0.5 would give the wrong number. */ if (ExponentComponent(x) >= 52) return x; return js_copysign(floor(x + 0.5), x); }
double js::math_round_impl(double x) { int32_t ignored; if (NumberIsInt32(x, &ignored)) return x; /* Some numbers are so big that adding 0.5 would give the wrong number. */ if (ExponentComponent(x) >= int_fast16_t(FloatingPoint<double>::kExponentShift)) return x; double add = (x >= 0) ? GetBiggestNumberLessThan(0.5) : 0.5; return js_copysign(floor(x + add), x); }
static void TestExponentComponent() { MOZ_ASSERT(ExponentComponent(0.0) == -int_fast16_t(DoubleExponentBias)); MOZ_ASSERT(ExponentComponent(-0.0) == -int_fast16_t(DoubleExponentBias)); MOZ_ASSERT(ExponentComponent(0.125) == -3); MOZ_ASSERT(ExponentComponent(0.5) == -1); MOZ_ASSERT(ExponentComponent(1.0) == 0); MOZ_ASSERT(ExponentComponent(1.5) == 0); MOZ_ASSERT(ExponentComponent(2.0) == 1); MOZ_ASSERT(ExponentComponent(7) == 2); MOZ_ASSERT(ExponentComponent(PositiveInfinity()) == DoubleExponentBias + 1); MOZ_ASSERT(ExponentComponent(NegativeInfinity()) == DoubleExponentBias + 1); MOZ_ASSERT(ExponentComponent(UnspecifiedNaN()) == DoubleExponentBias + 1); }