@@ -64,11 +64,13 @@ _PyLong_FromTime_t(time_t t)
64
64
static double
65
65
_PyTime_RoundHalfUp (double x )
66
66
{
67
- if (x >= 0.0 )
68
- x = floor (x + 0.5 );
67
+ /* volatile avoids optimization changing how numbers are rounded */
68
+ volatile double d = x ;
69
+ if (d >= 0.0 )
70
+ d = floor (d + 0.5 );
69
71
else
70
- x = ceil (x - 0.5 );
71
- return x ;
72
+ d = ceil (d - 0.5 );
73
+ return d ;
72
74
}
73
75
74
76
@@ -77,7 +79,7 @@ _PyTime_DoubleToDenominator(double d, time_t *sec, long *numerator,
77
79
double denominator , _PyTime_round_t round )
78
80
{
79
81
double intpart , err ;
80
- /* volatile avoids unsafe optimization on float enabled by gcc -O3 */
82
+ /* volatile avoids optimization changing how numbers are rounded */
81
83
volatile double floatpart ;
82
84
83
85
floatpart = modf (d , & intpart );
134
136
_PyTime_ObjectToTime_t (PyObject * obj , time_t * sec , _PyTime_round_t round )
135
137
{
136
138
if (PyFloat_Check (obj )) {
137
- double d , intpart , err ;
139
+ /* volatile avoids optimization changing how numbers are rounded */
140
+ volatile double d , intpart , err ;
138
141
139
142
d = PyFloat_AsDouble (obj );
140
143
if (round == _PyTime_ROUND_HALF_UP )
@@ -255,7 +258,7 @@ static int
255
258
_PyTime_FromFloatObject (_PyTime_t * t , double value , _PyTime_round_t round ,
256
259
long to_nanoseconds )
257
260
{
258
- /* volatile avoids unsafe optimization on float enabled by gcc -O3 */
261
+ /* volatile avoids optimization changing how numbers are rounded */
259
262
volatile double d , err ;
260
263
261
264
/* convert to a number of nanoseconds */
0 commit comments