pytime: add _PyTime_Round() helper to factorize code
This commit is contained in:
parent
ce6aa749b4
commit
9ae47dfbd9
|
@ -72,6 +72,17 @@ _PyTime_RoundHalfEven(double x)
|
||||||
return rounded;
|
return rounded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
_PyTime_Round(double x, _PyTime_round_t round)
|
||||||
|
{
|
||||||
|
if (round == _PyTime_ROUND_HALF_EVEN)
|
||||||
|
return _PyTime_RoundHalfEven(x);
|
||||||
|
else if (round == _PyTime_ROUND_CEILING)
|
||||||
|
return ceil(x);
|
||||||
|
else
|
||||||
|
return floor(x);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator,
|
_PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator,
|
||||||
double denominator, _PyTime_round_t round)
|
double denominator, _PyTime_round_t round)
|
||||||
|
@ -83,12 +94,7 @@ _PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator,
|
||||||
floatpart = modf(d, &intpart);
|
floatpart = modf(d, &intpart);
|
||||||
|
|
||||||
floatpart *= denominator;
|
floatpart *= denominator;
|
||||||
if (round == _PyTime_ROUND_HALF_EVEN)
|
floatpart = _PyTime_Round(floatpart, round);
|
||||||
floatpart = _PyTime_RoundHalfEven(floatpart);
|
|
||||||
else if (round == _PyTime_ROUND_CEILING)
|
|
||||||
floatpart = ceil(floatpart);
|
|
||||||
else
|
|
||||||
floatpart = floor(floatpart);
|
|
||||||
if (floatpart >= denominator) {
|
if (floatpart >= denominator) {
|
||||||
floatpart -= denominator;
|
floatpart -= denominator;
|
||||||
intpart += 1.0;
|
intpart += 1.0;
|
||||||
|
@ -139,12 +145,7 @@ _PyTime_ObjectToTime_t(PyObject *obj, time_t *sec, _PyTime_round_t round)
|
||||||
volatile double d;
|
volatile double d;
|
||||||
|
|
||||||
d = PyFloat_AsDouble(obj);
|
d = PyFloat_AsDouble(obj);
|
||||||
if (round == _PyTime_ROUND_HALF_EVEN)
|
d = _PyTime_Round(d, round);
|
||||||
d = _PyTime_RoundHalfEven(d);
|
|
||||||
else if (round == _PyTime_ROUND_CEILING)
|
|
||||||
d = ceil(d);
|
|
||||||
else
|
|
||||||
d = floor(d);
|
|
||||||
(void)modf(d, &intpart);
|
(void)modf(d, &intpart);
|
||||||
|
|
||||||
*sec = (time_t)intpart;
|
*sec = (time_t)intpart;
|
||||||
|
@ -255,7 +256,7 @@ _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv, int raise)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_PyTime_FromFloatObject(_PyTime_t *t, double value, _PyTime_round_t round,
|
_PyTime_FromFloatObject(_PyTime_t *t, double value, _PyTime_round_t round,
|
||||||
long to_nanoseconds)
|
long unit_to_ns)
|
||||||
{
|
{
|
||||||
double err;
|
double err;
|
||||||
/* volatile avoids optimization changing how numbers are rounded */
|
/* volatile avoids optimization changing how numbers are rounded */
|
||||||
|
@ -263,14 +264,8 @@ _PyTime_FromFloatObject(_PyTime_t *t, double value, _PyTime_round_t round,
|
||||||
|
|
||||||
/* convert to a number of nanoseconds */
|
/* convert to a number of nanoseconds */
|
||||||
d = value;
|
d = value;
|
||||||
d *= to_nanoseconds;
|
d *= (double)unit_to_ns;
|
||||||
|
d = _PyTime_Round(d, round);
|
||||||
if (round == _PyTime_ROUND_HALF_EVEN)
|
|
||||||
d = _PyTime_RoundHalfEven(d);
|
|
||||||
else if (round == _PyTime_ROUND_CEILING)
|
|
||||||
d = ceil(d);
|
|
||||||
else
|
|
||||||
d = floor(d);
|
|
||||||
|
|
||||||
*t = (_PyTime_t)d;
|
*t = (_PyTime_t)d;
|
||||||
err = d - (double)*t;
|
err = d - (double)*t;
|
||||||
|
@ -283,12 +278,12 @@ _PyTime_FromFloatObject(_PyTime_t *t, double value, _PyTime_round_t round,
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_PyTime_FromObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round,
|
_PyTime_FromObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round,
|
||||||
long to_nanoseconds)
|
long unit_to_ns)
|
||||||
{
|
{
|
||||||
if (PyFloat_Check(obj)) {
|
if (PyFloat_Check(obj)) {
|
||||||
double d;
|
double d;
|
||||||
d = PyFloat_AsDouble(obj);
|
d = PyFloat_AsDouble(obj);
|
||||||
return _PyTime_FromFloatObject(t, d, round, to_nanoseconds);
|
return _PyTime_FromFloatObject(t, d, round, unit_to_ns);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#ifdef HAVE_LONG_LONG
|
#ifdef HAVE_LONG_LONG
|
||||||
|
@ -305,8 +300,8 @@ _PyTime_FromObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round,
|
||||||
_PyTime_overflow();
|
_PyTime_overflow();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*t = sec * to_nanoseconds;
|
*t = sec * unit_to_ns;
|
||||||
if (*t / to_nanoseconds != sec) {
|
if (*t / unit_to_ns != sec) {
|
||||||
_PyTime_overflow();
|
_PyTime_overflow();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue