mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Extracting ecma_number_trunc helper from ecma_op_number_remainder.
This commit is contained in:
parent
42abd7d63a
commit
2d032a30dc
@ -409,6 +409,44 @@ ecma_number_negate (ecma_number_t num) /**< ecma-number */
|
|||||||
return u.value;
|
return u.value;
|
||||||
} /* ecma_number_negate */
|
} /* ecma_number_negate */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate fractional part of the number
|
||||||
|
*
|
||||||
|
* @return integer part of the number
|
||||||
|
*/
|
||||||
|
ecma_number_t
|
||||||
|
ecma_number_trunc (ecma_number_t num) /**< ecma-number */
|
||||||
|
{
|
||||||
|
uint64_t fraction;
|
||||||
|
int32_t exponent;
|
||||||
|
const int32_t dot_shift = ecma_number_get_fraction_and_exponent (num, &fraction, &exponent);
|
||||||
|
const bool sign = ecma_number_is_negative (num);
|
||||||
|
|
||||||
|
if (exponent < 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (exponent < dot_shift)
|
||||||
|
{
|
||||||
|
fraction &= ~((1ull << (dot_shift - exponent)) - 1);
|
||||||
|
|
||||||
|
ecma_number_t tmp = ecma_number_make_normal_positive_from_fraction_and_exponent (fraction,
|
||||||
|
exponent);
|
||||||
|
if (sign)
|
||||||
|
{
|
||||||
|
return ecma_number_negate (tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
} /* ecma_number_trunc */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ECMA-number addition.
|
* ECMA-number addition.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -137,12 +137,15 @@ extern bool ecma_number_is_nan (ecma_number_t num);
|
|||||||
extern bool ecma_number_is_negative (ecma_number_t num);
|
extern bool ecma_number_is_negative (ecma_number_t num);
|
||||||
extern bool ecma_number_is_zero (ecma_number_t num);
|
extern bool ecma_number_is_zero (ecma_number_t num);
|
||||||
extern bool ecma_number_is_infinity (ecma_number_t num);
|
extern bool ecma_number_is_infinity (ecma_number_t num);
|
||||||
extern int32_t ecma_number_get_fraction_and_exponent (ecma_number_t num,
|
extern int32_t
|
||||||
uint64_t *out_fraction_p,
|
ecma_number_get_fraction_and_exponent (ecma_number_t num,
|
||||||
int32_t *out_exponent_p);
|
uint64_t *out_fraction_p,
|
||||||
extern ecma_number_t ecma_number_make_normal_positive_from_fraction_and_exponent (uint64_t fraction,
|
int32_t *out_exponent_p);
|
||||||
int32_t exponent);
|
extern ecma_number_t
|
||||||
|
ecma_number_make_normal_positive_from_fraction_and_exponent (uint64_t fraction,
|
||||||
|
int32_t exponent);
|
||||||
extern ecma_number_t ecma_number_negate (ecma_number_t num);
|
extern ecma_number_t ecma_number_negate (ecma_number_t num);
|
||||||
|
extern ecma_number_t ecma_number_trunc (ecma_number_t num);
|
||||||
extern ecma_number_t ecma_number_add (ecma_number_t left_num, ecma_number_t right_num);
|
extern ecma_number_t ecma_number_add (ecma_number_t left_num, ecma_number_t right_num);
|
||||||
extern ecma_number_t ecma_number_substract (ecma_number_t left_num, ecma_number_t right_num);
|
extern ecma_number_t ecma_number_substract (ecma_number_t left_num, ecma_number_t right_num);
|
||||||
extern ecma_number_t ecma_number_multiply (ecma_number_t left_num, ecma_number_t right_num);
|
extern ecma_number_t ecma_number_multiply (ecma_number_t left_num, ecma_number_t right_num);
|
||||||
|
|||||||
@ -63,29 +63,7 @@ ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */
|
|||||||
&& !ecma_number_is_zero (d)
|
&& !ecma_number_is_zero (d)
|
||||||
&& !ecma_number_is_infinity (d));
|
&& !ecma_number_is_infinity (d));
|
||||||
|
|
||||||
ecma_number_t q = ecma_number_divide (n, d);
|
ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d));
|
||||||
|
|
||||||
uint64_t fraction;
|
|
||||||
int32_t exponent;
|
|
||||||
const int32_t dot_shift = ecma_number_get_fraction_and_exponent (q, &fraction, &exponent);
|
|
||||||
const bool sign = ecma_number_is_negative (q);
|
|
||||||
|
|
||||||
if (exponent < 0)
|
|
||||||
{
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exponent < dot_shift)
|
|
||||||
{
|
|
||||||
fraction &= ~((1ull << (dot_shift - exponent)) - 1);
|
|
||||||
|
|
||||||
q = ecma_number_make_normal_positive_from_fraction_and_exponent (fraction,
|
|
||||||
exponent);
|
|
||||||
if (sign)
|
|
||||||
{
|
|
||||||
q = ecma_number_negate (q);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ecma_number_substract (n, ecma_number_multiply (d, q));
|
return ecma_number_substract (n, ecma_number_multiply (d, q));
|
||||||
} /* ecma_op_number_remainder */
|
} /* ecma_op_number_remainder */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user