Skip to content

Commit 3bcbb5e

Browse files
committed
Revert logic of fabs in rounding function
1 parent ebbad52 commit 3bcbb5e

File tree

1 file changed

+65
-67
lines changed

1 file changed

+65
-67
lines changed

ext/standard/math.c

Lines changed: 65 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static inline int php_intlog10abs(double value) {
3636
value = fabs(value);
3737

3838
if (value < 1e-8 || value > 1e22) {
39-
return (int)floor(log10(value));
39+
return (int) floor(log10(value));
4040
} else {
4141
/* Do a binary search with 5 steps */
4242
int result = 15;
@@ -79,7 +79,7 @@ static inline int php_intlog10abs(double value) {
7979
static inline double php_intpow10(int power) {
8080
/* Not in lookup table */
8181
if (power < 0 || power > 22) {
82-
return pow(10.0, (double)power);
82+
return pow(10.0, (double) power);
8383
}
8484

8585
static const double powers[] = {
@@ -101,11 +101,11 @@ static inline double php_round_helper(double value, int mode) {
101101
* in branches in the assembly) to make the following cases simpler.
102102
*/
103103
double integral;
104-
double fractional = modf(value, &integral);
104+
double fractional = fabs(modf(value, &integral));
105105

106106
switch (mode) {
107107
case PHP_ROUND_HALF_UP:
108-
if (fabs(fractional) >= 0.5) {
108+
if (fractional >= 0.5) {
109109
/* We must increase the magnitude of the integral part
110110
* (rounding up / towards infinity). copysign(1.0, integral)
111111
* will either result in 1.0 or -1.0 depending on the sign
@@ -120,7 +120,7 @@ static inline double php_round_helper(double value, int mode) {
120120
return integral;
121121

122122
case PHP_ROUND_HALF_DOWN:
123-
if (fabs(fractional) > 0.5) {
123+
if (fractional > 0.5) {
124124
return integral + copysign(1.0, integral);
125125
}
126126

@@ -145,7 +145,6 @@ static inline double php_round_helper(double value, int mode) {
145145
return fractional == 0 ? integral : integral + copysign(1.0, integral);
146146

147147
case PHP_ROUND_HALF_EVEN:
148-
fractional = fabs(fractional);
149148
if (fractional > 0.5) {
150149
return integral + copysign(1.0, integral);
151150
}
@@ -164,7 +163,6 @@ static inline double php_round_helper(double value, int mode) {
164163
return integral;
165164

166165
case PHP_ROUND_HALF_ODD:
167-
fractional = fabs(fractional);
168166
if (fractional > 0.5) {
169167
return integral + copysign(1.0, integral);
170168
}
@@ -179,7 +177,7 @@ static inline double php_round_helper(double value, int mode) {
179177

180178
return integral;
181179

182-
EMPTY_SWITCH_DEFAULT_CASE();
180+
EMPTY_SWITCH_DEFAULT_CASE();
183181
}
184182
// FIXME: GCC bug, branch is considered reachable.
185183
ZEND_UNREACHABLE();
@@ -200,7 +198,7 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
200198
return value;
201199
}
202200

203-
places = places < INT_MIN+1 ? INT_MIN+1 : places;
201+
places = places < INT_MIN + 1 ? INT_MIN + 1 : places;
204202
precision_places = 14 - php_intlog10abs(value);
205203

206204
f1 = php_intpow10(abs(places));
@@ -209,9 +207,9 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
209207
the requested places BUT is small enough to make sure a non-zero value
210208
is returned, pre-round the result to the precision */
211209
if (precision_places > places && precision_places - 15 < places) {
212-
int64_t use_precision = precision_places < INT_MIN+1 ? INT_MIN+1 : precision_places;
210+
int64_t use_precision = precision_places < INT_MIN + 1 ? INT_MIN + 1 : precision_places;
213211

214-
f2 = php_intpow10(abs((int)use_precision));
212+
f2 = php_intpow10(abs((int) use_precision));
215213
if (use_precision >= 0) {
216214
tmp_value = value * f2;
217215
} else {
@@ -222,9 +220,9 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
222220
tmp_value = php_round_helper(tmp_value, mode);
223221

224222
use_precision = places - precision_places;
225-
use_precision = use_precision < INT_MIN+1 ? INT_MIN+1 : use_precision;
223+
use_precision = use_precision < INT_MIN + 1 ? INT_MIN + 1 : use_precision;
226224
/* now correctly move the decimal point */
227-
f2 = php_intpow10(abs((int)use_precision));
225+
f2 = php_intpow10(abs((int) use_precision));
228226
/* because places < precision_places */
229227
tmp_value = tmp_value / f2;
230228
} else {
@@ -275,79 +273,79 @@ PHPAPI double _php_math_round(double value, int places, int mode) {
275273

276274
/* {{{ Return the absolute value of the number */
277275
PHP_FUNCTION(abs)
278-
{
279-
zval *value;
276+
{
277+
zval * value;
280278

281-
ZEND_PARSE_PARAMETERS_START(1, 1)
279+
ZEND_PARSE_PARAMETERS_START(1, 1)
282280
Z_PARAM_NUMBER(value)
283-
ZEND_PARSE_PARAMETERS_END();
281+
ZEND_PARSE_PARAMETERS_END();
284282

285-
switch (Z_TYPE_P(value)) {
286-
case IS_LONG:
287-
if (UNEXPECTED(Z_LVAL_P(value) == ZEND_LONG_MIN)) {
288-
RETURN_DOUBLE(-(double)ZEND_LONG_MIN);
289-
} else {
290-
RETURN_LONG(Z_LVAL_P(value) < 0 ? -Z_LVAL_P(value) : Z_LVAL_P(value));
291-
}
292-
case IS_DOUBLE:
293-
RETURN_DOUBLE(fabs(Z_DVAL_P(value)));
294-
EMPTY_SWITCH_DEFAULT_CASE();
295-
}
296-
}
283+
switch (Z_TYPE_P(value)) {
284+
case IS_LONG:
285+
if (UNEXPECTED(Z_LVAL_P(value) == ZEND_LONG_MIN)) {
286+
RETURN_DOUBLE(-(double) ZEND_LONG_MIN);
287+
} else {
288+
RETURN_LONG(Z_LVAL_P(value) < 0 ? -Z_LVAL_P(value) : Z_LVAL_P(value));
289+
}
290+
case IS_DOUBLE:
291+
RETURN_DOUBLE(fabs(Z_DVAL_P(value)));
292+
EMPTY_SWITCH_DEFAULT_CASE();
293+
}
294+
}
297295
/* }}} */
298296

299297
/* {{{ Returns the next highest integer value of the number */
300298
PHP_FUNCTION(ceil)
301299
{
302300
zval * value;
303301

304-
ZEND_PARSE_PARAMETERS_START(1, 1)
302+
ZEND_PARSE_PARAMETERS_START(1, 1)
305303
Z_PARAM_NUMBER(value)
306-
ZEND_PARSE_PARAMETERS_END();
307-
308-
switch (Z_TYPE_P(value)) {
309-
case IS_LONG:
310-
RETURN_DOUBLE(zval_get_double(value));
311-
case IS_DOUBLE:
312-
RETURN_DOUBLE(ceil(Z_DVAL_P(value)));
313-
EMPTY_SWITCH_DEFAULT_CASE();
314-
}
315-
}
304+
ZEND_PARSE_PARAMETERS_END();
305+
306+
switch (Z_TYPE_P(value)) {
307+
case IS_LONG:
308+
RETURN_DOUBLE(zval_get_double(value));
309+
case IS_DOUBLE:
310+
RETURN_DOUBLE(ceil(Z_DVAL_P(value)));
311+
EMPTY_SWITCH_DEFAULT_CASE();
312+
}
313+
}
316314
/* }}} */
317315

318316
/* {{{ Returns the next lowest integer value from the number */
319317
PHP_FUNCTION(floor)
320-
{
321-
zval *value;
318+
{
319+
zval * value;
322320

323-
ZEND_PARSE_PARAMETERS_START(1, 1)
321+
ZEND_PARSE_PARAMETERS_START(1, 1)
324322
Z_PARAM_NUMBER(value)
325-
ZEND_PARSE_PARAMETERS_END();
326-
327-
switch (Z_TYPE_P(value)) {
328-
case IS_LONG:
329-
RETURN_DOUBLE(zval_get_double(value));
330-
case IS_DOUBLE:
331-
RETURN_DOUBLE(floor(Z_DVAL_P(value)));
332-
EMPTY_SWITCH_DEFAULT_CASE();
333-
}
334-
}
323+
ZEND_PARSE_PARAMETERS_END();
324+
325+
switch (Z_TYPE_P(value)) {
326+
case IS_LONG:
327+
RETURN_DOUBLE(zval_get_double(value));
328+
case IS_DOUBLE:
329+
RETURN_DOUBLE(floor(Z_DVAL_P(value)));
330+
EMPTY_SWITCH_DEFAULT_CASE();
331+
}
332+
}
335333
/* }}} */
336334

337335
/* {{{ Returns the number rounded to specified precision */
338336
PHP_FUNCTION(round)
339-
{
340-
zval *value;
341-
int places = 0;
342-
zend_long precision = 0;
343-
zend_long mode = PHP_ROUND_HALF_UP;
337+
{
338+
zval * value;
339+
int places = 0;
340+
zend_long precision = 0;
341+
zend_long mode = PHP_ROUND_HALF_UP;
344342

345-
ZEND_PARSE_PARAMETERS_START(1, 3)
343+
ZEND_PARSE_PARAMETERS_START(1, 3)
346344
Z_PARAM_NUMBER(value)
347345
Z_PARAM_OPTIONAL
348346
Z_PARAM_LONG(precision)
349347
Z_PARAM_LONG(mode)
350-
ZEND_PARSE_PARAMETERS_END();
348+
ZEND_PARSE_PARAMETERS_END();
351349

352350
if (ZEND_NUM_ARGS() >= 2) {
353351
if (precision >= 0) {
@@ -370,14 +368,14 @@ PHP_FUNCTION(round)
370368
default:
371369
zend_argument_value_error(3, "must be a valid rounding mode (PHP_ROUND_*)");
372370
RETURN_THROWS();
373-
}
371+
}
374372

375-
switch (Z_TYPE_P(value)) {
376-
case IS_LONG:
377-
/* Simple case - long that doesn't need to be rounded. */
378-
if (places >= 0) {
379-
RETURN_DOUBLE(zval_get_double(value));
380-
}
373+
switch (Z_TYPE_P(value)) {
374+
case IS_LONG:
375+
/* Simple case - long that doesn't need to be rounded. */
376+
if (places >= 0) {
377+
RETURN_DOUBLE(zval_get_double(value));
378+
}
381379
ZEND_FALLTHROUGH;
382380

383381
case IS_DOUBLE:

0 commit comments

Comments
 (0)