@@ -101,10 +101,10 @@ static inline double php_round_helper(double value, int mode) {
101
101
* the absolute value of the fractional part (which will not result
102
102
* in branches in the assembly) to make the following cases simpler.
103
103
*/
104
- fractional = fabs (modf (value , & integral ));
105
104
106
105
switch (mode ) {
107
106
case PHP_ROUND_HALF_UP :
107
+ fractional = fabs (modf (value , & integral ));
108
108
if (fractional >= 0.5 ) {
109
109
/* We must increase the magnitude of the integral part
110
110
* (rounding up / towards infinity). copysign(1.0, integral)
@@ -120,13 +120,35 @@ static inline double php_round_helper(double value, int mode) {
120
120
return integral ;
121
121
122
122
case PHP_ROUND_HALF_DOWN :
123
+ fractional = fabs (modf (value , & integral ));
123
124
if (fractional > 0.5 ) {
124
125
return integral + copysign (1.0 , integral );
125
126
}
126
127
127
128
return integral ;
128
129
130
+ case PHP_ROUND_CEILING :
131
+ return ceil (value );
132
+
133
+ case PHP_ROUND_FLOOR :
134
+ return floor (value );
135
+
136
+ case PHP_ROUND_TOWARD_ZERO :
137
+ if (value >= 0.0 ) {
138
+ return floor (value );
139
+ } else {
140
+ return = ceil (value );
141
+ }
142
+
143
+ case PHP_ROUND_AWAY_FROM_ZERO :
144
+ if (value >= 0.0 ) {
145
+ return = ceil (value );
146
+ } else {
147
+ return = floor (value );
148
+ }
149
+
129
150
case PHP_ROUND_HALF_EVEN :
151
+ fractional = fabs (modf (value , & integral ));
130
152
if (fractional > 0.5 ) {
131
153
return integral + copysign (1.0 , integral );
132
154
}
@@ -143,7 +165,9 @@ static inline double php_round_helper(double value, int mode) {
143
165
}
144
166
145
167
return integral ;
168
+
146
169
case PHP_ROUND_HALF_ODD :
170
+ fractional = fabs (modf (value , & integral ));
147
171
if (fractional > 0.5 ) {
148
172
return integral + copysign (1.0 , integral );
149
173
}
@@ -157,6 +181,7 @@ static inline double php_round_helper(double value, int mode) {
157
181
}
158
182
159
183
return integral ;
184
+
160
185
EMPTY_SWITCH_DEFAULT_CASE ();
161
186
}
162
187
}
@@ -258,16 +283,16 @@ PHP_FUNCTION(abs)
258
283
Z_PARAM_NUMBER (value )
259
284
ZEND_PARSE_PARAMETERS_END ();
260
285
261
- switch (Z_TYPE_P (value )) {
262
- case IS_LONG :
263
- if (UNEXPECTED ( Z_LVAL_P ( value ) == ZEND_LONG_MIN ) ) {
264
- RETURN_DOUBLE ( - ( double ) ZEND_LONG_MIN );
265
- } else {
266
- RETURN_LONG ( Z_LVAL_P ( value ) < 0 ? - Z_LVAL_P ( value ) : Z_LVAL_P ( value ));
267
- }
268
- case IS_DOUBLE :
269
- RETURN_DOUBLE ( fabs ( Z_DVAL_P ( value )));
270
- EMPTY_SWITCH_DEFAULT_CASE ( );
286
+ if (Z_TYPE_P (value ) == IS_DOUBLE ) {
287
+ RETURN_DOUBLE ( fabs ( Z_DVAL_P ( value )));
288
+ } else if (Z_TYPE_P ( value ) == IS_LONG ) {
289
+ if ( Z_LVAL_P ( value ) == ZEND_LONG_MIN ) {
290
+ RETURN_DOUBLE ( - ( double ) ZEND_LONG_MIN );
291
+ } else {
292
+ RETURN_LONG ( Z_LVAL_P ( value ) < 0 ? - Z_LVAL_P ( value ) : Z_LVAL_P ( value ));
293
+ }
294
+ } else {
295
+ ZEND_ASSERT ( 0 && "Unexpected type" );
271
296
}
272
297
}
273
298
/* }}} */
@@ -281,12 +306,12 @@ PHP_FUNCTION(ceil)
281
306
Z_PARAM_NUMBER (value )
282
307
ZEND_PARSE_PARAMETERS_END ();
283
308
284
- switch (Z_TYPE_P (value )) {
285
- case IS_LONG :
286
- RETURN_DOUBLE ( zval_get_double (value ));
287
- case IS_DOUBLE :
288
- RETURN_DOUBLE ( ceil ( Z_DVAL_P ( value )));
289
- EMPTY_SWITCH_DEFAULT_CASE ( );
309
+ if (Z_TYPE_P (value ) == IS_DOUBLE ) {
310
+ RETURN_DOUBLE ( ceil ( Z_DVAL_P ( value )));
311
+ } else if ( Z_TYPE_P (value ) == IS_LONG ) {
312
+ RETURN_DOUBLE ( zval_get_double ( value ));
313
+ } else {
314
+ ZEND_ASSERT ( 0 && "Unexpected type" );
290
315
}
291
316
}
292
317
/* }}} */
@@ -300,12 +325,12 @@ PHP_FUNCTION(floor)
300
325
Z_PARAM_NUMBER (value )
301
326
ZEND_PARSE_PARAMETERS_END ();
302
327
303
- switch (Z_TYPE_P (value )) {
304
- case IS_LONG :
305
- RETURN_DOUBLE ( zval_get_double (value ));
306
- case IS_DOUBLE :
307
- RETURN_DOUBLE ( floor ( Z_DVAL_P ( value )));
308
- EMPTY_SWITCH_DEFAULT_CASE ( );
328
+ if (Z_TYPE_P (value ) == IS_DOUBLE ) {
329
+ RETURN_DOUBLE ( floor ( Z_DVAL_P ( value )));
330
+ } else if ( Z_TYPE_P (value ) == IS_LONG ) {
331
+ RETURN_DOUBLE ( zval_get_double ( value ));
332
+ } else {
333
+ ZEND_ASSERT ( 0 && "Unexpected type" );
309
334
}
310
335
}
311
336
/* }}} */
@@ -317,6 +342,7 @@ PHP_FUNCTION(round)
317
342
int places = 0 ;
318
343
zend_long precision = 0 ;
319
344
zend_long mode = PHP_ROUND_HALF_UP ;
345
+ double return_val ;
320
346
321
347
ZEND_PARSE_PARAMETERS_START (1 , 3 )
322
348
Z_PARAM_NUMBER (value )
@@ -333,29 +359,21 @@ PHP_FUNCTION(round)
333
359
}
334
360
}
335
361
336
- switch (mode ) {
337
- case PHP_ROUND_HALF_UP :
338
- case PHP_ROUND_HALF_DOWN :
339
- case PHP_ROUND_HALF_EVEN :
340
- case PHP_ROUND_HALF_ODD :
341
- break ;
342
- default :
343
- zend_argument_value_error (3 , "must be a valid rounding mode (PHP_ROUND_*)" );
344
- RETURN_THROWS ();
345
- }
346
-
347
362
switch (Z_TYPE_P (value )) {
348
363
case IS_LONG :
349
364
/* Simple case - long that doesn't need to be rounded. */
350
365
if (places >= 0 ) {
351
- RETURN_DOUBLE (zval_get_double (value ));
366
+ RETURN_DOUBLE (( double ) Z_LVAL_P (value ));
352
367
}
353
368
ZEND_FALLTHROUGH ;
354
369
355
370
case IS_DOUBLE :
356
- RETURN_DOUBLE (_php_math_round (zval_get_double (value ), (int )places , (int )mode ));
371
+ return_val = (Z_TYPE_P (value ) == IS_LONG ) ? (double )Z_LVAL_P (value ) : Z_DVAL_P (value );
372
+ return_val = _php_math_round (return_val , (int )places , (int )mode );
373
+ RETURN_DOUBLE (return_val );
374
+ break ;
357
375
358
- EMPTY_SWITCH_DEFAULT_CASE ();
376
+ EMPTY_SWITCH_DEFAULT_CASE ()
359
377
}
360
378
}
361
379
/* }}} */
0 commit comments