diff --git a/ext/bcmath/libbcmath/src/div.c b/ext/bcmath/libbcmath/src/div.c index 809d887f68b9..35ca450ceb78 100644 --- a/ext/bcmath/libbcmath/src/div.c +++ b/ext/bcmath/libbcmath/src/div.c @@ -344,7 +344,7 @@ bool bc_divide(bc_num numerator, bc_num divisor, bc_num *quot, size_t scale) } /* If divisor is 1 / -1, the quotient's n_value is equal to numerator's n_value. */ - if (_bc_do_compare(divisor, BCG(_one_), scale, false) == BCMATH_EQUAL) { + if (_bc_do_compare(divisor, BCG(_one_), divisor->n_scale, false) == BCMATH_EQUAL) { size_t quot_scale = MIN(numerator->n_scale, scale); *quot = bc_new_num_nonzeroed(numerator->n_len, quot_scale); char *qptr = (*quot)->n_value; diff --git a/ext/bcmath/tests/bcdiv_by_one.phpt b/ext/bcmath/tests/bcdiv_by_one.phpt new file mode 100644 index 000000000000..cfa4bc384ca9 --- /dev/null +++ b/ext/bcmath/tests/bcdiv_by_one.phpt @@ -0,0 +1,98 @@ +--TEST-- +bcdiv() function div by one +--EXTENSIONS-- +bcmath +--INI-- +bcmath.scale=0 +--FILE-- + +--EXPECT-- +scale: 0 + 100 / 1.010 = 99 +-100 / 1.010 = -99 + 100 / 1.01 = 99 +-100 / 1.01 = -99 + 100 / 1.1 = 90 +-100 / 1.1 = -90 + 100 / 1 = 100 +-100 / 1 = -100 + 100 / -1.010 = -99 +-100 / -1.010 = 99 + 100 / -1.01 = -99 +-100 / -1.01 = 99 + 100 / -1.1 = -90 +-100 / -1.1 = 90 + 100 / -1 = -100 +-100 / -1 = 100 + +scale: 1 + 100 / 1.010 = 99.0 +-100 / 1.010 = -99.0 + 100 / 1.01 = 99.0 +-100 / 1.01 = -99.0 + 100 / 1.1 = 90.9 +-100 / 1.1 = -90.9 + 100 / 1 = 100.0 +-100 / 1 = -100.0 + 100 / -1.010 = -99.0 +-100 / -1.010 = 99.0 + 100 / -1.01 = -99.0 +-100 / -1.01 = 99.0 + 100 / -1.1 = -90.9 +-100 / -1.1 = 90.9 + 100 / -1 = -100.0 +-100 / -1 = 100.0 + +scale: 2 + 100 / 1.010 = 99.00 +-100 / 1.010 = -99.00 + 100 / 1.01 = 99.00 +-100 / 1.01 = -99.00 + 100 / 1.1 = 90.90 +-100 / 1.1 = -90.90 + 100 / 1 = 100.00 +-100 / 1 = -100.00 + 100 / -1.010 = -99.00 +-100 / -1.010 = 99.00 + 100 / -1.01 = -99.00 +-100 / -1.01 = 99.00 + 100 / -1.1 = -90.90 +-100 / -1.1 = 90.90 + 100 / -1 = -100.00 +-100 / -1 = 100.00 + +scale: 3 + 100 / 1.010 = 99.009 +-100 / 1.010 = -99.009 + 100 / 1.01 = 99.009 +-100 / 1.01 = -99.009 + 100 / 1.1 = 90.909 +-100 / 1.1 = -90.909 + 100 / 1 = 100.000 +-100 / 1 = -100.000 + 100 / -1.010 = -99.009 +-100 / -1.010 = 99.009 + 100 / -1.01 = -99.009 +-100 / -1.01 = 99.009 + 100 / -1.1 = -90.909 +-100 / -1.1 = 90.909 + 100 / -1 = -100.000 +-100 / -1 = 100.000 diff --git a/ext/bcmath/tests/bcdiv_by_pow_10.phpt b/ext/bcmath/tests/bcdiv_by_pow_10.phpt index e89ba27bf080..072edbd710b0 100644 --- a/ext/bcmath/tests/bcdiv_by_pow_10.phpt +++ b/ext/bcmath/tests/bcdiv_by_pow_10.phpt @@ -6,18 +6,18 @@ bcmath bcmath.scale=0 --FILE-- --EXPECT-- scale: 0 -0.012345 / 0.01 = 1 - 0.12345 / 0.01 = 12 - 1.2345 / 0.01 = 123 - 12.345 / 0.01 = 1234 - 123.45 / 0.01 = 12345 -0.012345 / 0.1 = 0 - 0.12345 / 0.1 = 1 - 1.2345 / 0.1 = 12 - 12.345 / 0.1 = 123 - 123.45 / 0.1 = 1234 -0.012345 / 1 = 0 - 0.12345 / 1 = 0 - 1.2345 / 1 = 1 - 12.345 / 1 = 12 - 123.45 / 1 = 123 -0.012345 / 10 = 0 - 0.12345 / 10 = 0 - 1.2345 / 10 = 0 - 12.345 / 10 = 1 - 123.45 / 10 = 12 -0.012345 / 100 = 0 - 0.12345 / 100 = 0 - 1.2345 / 100 = 0 - 12.345 / 100 = 0 - 123.45 / 100 = 1 + 0.012345 / 0.01 = 1 + 0.12345 / 0.01 = 12 + 1.2345 / 0.01 = 123 + 12.345 / 0.01 = 1234 + 123.45 / 0.01 = 12345 +-0.012345 / 0.01 = -1 + -0.12345 / 0.01 = -12 + -1.2345 / 0.01 = -123 + -12.345 / 0.01 = -1234 + -123.45 / 0.01 = -12345 + 0.012345 / 0.1 = 0 + 0.12345 / 0.1 = 1 + 1.2345 / 0.1 = 12 + 12.345 / 0.1 = 123 + 123.45 / 0.1 = 1234 +-0.012345 / 0.1 = 0 + -0.12345 / 0.1 = -1 + -1.2345 / 0.1 = -12 + -12.345 / 0.1 = -123 + -123.45 / 0.1 = -1234 + 0.012345 / 1 = 0 + 0.12345 / 1 = 0 + 1.2345 / 1 = 1 + 12.345 / 1 = 12 + 123.45 / 1 = 123 +-0.012345 / 1 = 0 + -0.12345 / 1 = 0 + -1.2345 / 1 = -1 + -12.345 / 1 = -12 + -123.45 / 1 = -123 + 0.012345 / 10 = 0 + 0.12345 / 10 = 0 + 1.2345 / 10 = 0 + 12.345 / 10 = 1 + 123.45 / 10 = 12 +-0.012345 / 10 = 0 + -0.12345 / 10 = 0 + -1.2345 / 10 = 0 + -12.345 / 10 = -1 + -123.45 / 10 = -12 + 0.012345 / 100 = 0 + 0.12345 / 100 = 0 + 1.2345 / 100 = 0 + 12.345 / 100 = 0 + 123.45 / 100 = 1 +-0.012345 / 100 = 0 + -0.12345 / 100 = 0 + -1.2345 / 100 = 0 + -12.345 / 100 = 0 + -123.45 / 100 = -1 + 0.012345 / -0.01 = -1 + 0.12345 / -0.01 = -12 + 1.2345 / -0.01 = -123 + 12.345 / -0.01 = -1234 + 123.45 / -0.01 = -12345 +-0.012345 / -0.01 = 1 + -0.12345 / -0.01 = 12 + -1.2345 / -0.01 = 123 + -12.345 / -0.01 = 1234 + -123.45 / -0.01 = 12345 + 0.012345 / -0.1 = 0 + 0.12345 / -0.1 = -1 + 1.2345 / -0.1 = -12 + 12.345 / -0.1 = -123 + 123.45 / -0.1 = -1234 +-0.012345 / -0.1 = 0 + -0.12345 / -0.1 = 1 + -1.2345 / -0.1 = 12 + -12.345 / -0.1 = 123 + -123.45 / -0.1 = 1234 + 0.012345 / -1 = 0 + 0.12345 / -1 = 0 + 1.2345 / -1 = -1 + 12.345 / -1 = -12 + 123.45 / -1 = -123 +-0.012345 / -1 = 0 + -0.12345 / -1 = 0 + -1.2345 / -1 = 1 + -12.345 / -1 = 12 + -123.45 / -1 = 123 + 0.012345 / -10 = 0 + 0.12345 / -10 = 0 + 1.2345 / -10 = 0 + 12.345 / -10 = -1 + 123.45 / -10 = -12 +-0.012345 / -10 = 0 + -0.12345 / -10 = 0 + -1.2345 / -10 = 0 + -12.345 / -10 = 1 + -123.45 / -10 = 12 + 0.012345 / -100 = 0 + 0.12345 / -100 = 0 + 1.2345 / -100 = 0 + 12.345 / -100 = 0 + 123.45 / -100 = -1 +-0.012345 / -100 = 0 + -0.12345 / -100 = 0 + -1.2345 / -100 = 0 + -12.345 / -100 = 0 + -123.45 / -100 = 1 scale: 3 -0.012345 / 0.01 = 1.234 - 0.12345 / 0.01 = 12.345 - 1.2345 / 0.01 = 123.450 - 12.345 / 0.01 = 1234.500 - 123.45 / 0.01 = 12345.000 -0.012345 / 0.1 = 0.123 - 0.12345 / 0.1 = 1.234 - 1.2345 / 0.1 = 12.345 - 12.345 / 0.1 = 123.450 - 123.45 / 0.1 = 1234.500 -0.012345 / 1 = 0.012 - 0.12345 / 1 = 0.123 - 1.2345 / 1 = 1.234 - 12.345 / 1 = 12.345 - 123.45 / 1 = 123.450 -0.012345 / 10 = 0.001 - 0.12345 / 10 = 0.012 - 1.2345 / 10 = 0.123 - 12.345 / 10 = 1.234 - 123.45 / 10 = 12.345 -0.012345 / 100 = 0.000 - 0.12345 / 100 = 0.001 - 1.2345 / 100 = 0.012 - 12.345 / 100 = 0.123 - 123.45 / 100 = 1.234 + 0.012345 / 0.01 = 1.234 + 0.12345 / 0.01 = 12.345 + 1.2345 / 0.01 = 123.450 + 12.345 / 0.01 = 1234.500 + 123.45 / 0.01 = 12345.000 +-0.012345 / 0.01 = -1.234 + -0.12345 / 0.01 = -12.345 + -1.2345 / 0.01 = -123.450 + -12.345 / 0.01 = -1234.500 + -123.45 / 0.01 = -12345.000 + 0.012345 / 0.1 = 0.123 + 0.12345 / 0.1 = 1.234 + 1.2345 / 0.1 = 12.345 + 12.345 / 0.1 = 123.450 + 123.45 / 0.1 = 1234.500 +-0.012345 / 0.1 = -0.123 + -0.12345 / 0.1 = -1.234 + -1.2345 / 0.1 = -12.345 + -12.345 / 0.1 = -123.450 + -123.45 / 0.1 = -1234.500 + 0.012345 / 1 = 0.012 + 0.12345 / 1 = 0.123 + 1.2345 / 1 = 1.234 + 12.345 / 1 = 12.345 + 123.45 / 1 = 123.450 +-0.012345 / 1 = -0.012 + -0.12345 / 1 = -0.123 + -1.2345 / 1 = -1.234 + -12.345 / 1 = -12.345 + -123.45 / 1 = -123.450 + 0.012345 / 10 = 0.001 + 0.12345 / 10 = 0.012 + 1.2345 / 10 = 0.123 + 12.345 / 10 = 1.234 + 123.45 / 10 = 12.345 +-0.012345 / 10 = -0.001 + -0.12345 / 10 = -0.012 + -1.2345 / 10 = -0.123 + -12.345 / 10 = -1.234 + -123.45 / 10 = -12.345 + 0.012345 / 100 = 0.000 + 0.12345 / 100 = 0.001 + 1.2345 / 100 = 0.012 + 12.345 / 100 = 0.123 + 123.45 / 100 = 1.234 +-0.012345 / 100 = 0.000 + -0.12345 / 100 = -0.001 + -1.2345 / 100 = -0.012 + -12.345 / 100 = -0.123 + -123.45 / 100 = -1.234 + 0.012345 / -0.01 = -1.234 + 0.12345 / -0.01 = -12.345 + 1.2345 / -0.01 = -123.450 + 12.345 / -0.01 = -1234.500 + 123.45 / -0.01 = -12345.000 +-0.012345 / -0.01 = 1.234 + -0.12345 / -0.01 = 12.345 + -1.2345 / -0.01 = 123.450 + -12.345 / -0.01 = 1234.500 + -123.45 / -0.01 = 12345.000 + 0.012345 / -0.1 = -0.123 + 0.12345 / -0.1 = -1.234 + 1.2345 / -0.1 = -12.345 + 12.345 / -0.1 = -123.450 + 123.45 / -0.1 = -1234.500 +-0.012345 / -0.1 = 0.123 + -0.12345 / -0.1 = 1.234 + -1.2345 / -0.1 = 12.345 + -12.345 / -0.1 = 123.450 + -123.45 / -0.1 = 1234.500 + 0.012345 / -1 = -0.012 + 0.12345 / -1 = -0.123 + 1.2345 / -1 = -1.234 + 12.345 / -1 = -12.345 + 123.45 / -1 = -123.450 +-0.012345 / -1 = 0.012 + -0.12345 / -1 = 0.123 + -1.2345 / -1 = 1.234 + -12.345 / -1 = 12.345 + -123.45 / -1 = 123.450 + 0.012345 / -10 = -0.001 + 0.12345 / -10 = -0.012 + 1.2345 / -10 = -0.123 + 12.345 / -10 = -1.234 + 123.45 / -10 = -12.345 +-0.012345 / -10 = 0.001 + -0.12345 / -10 = 0.012 + -1.2345 / -10 = 0.123 + -12.345 / -10 = 1.234 + -123.45 / -10 = 12.345 + 0.012345 / -100 = 0.000 + 0.12345 / -100 = -0.001 + 1.2345 / -100 = -0.012 + 12.345 / -100 = -0.123 + 123.45 / -100 = -1.234 +-0.012345 / -100 = 0.000 + -0.12345 / -100 = 0.001 + -1.2345 / -100 = 0.012 + -12.345 / -100 = 0.123 + -123.45 / -100 = 1.234 scale: 5 -0.012345 / 0.01 = 1.23450 - 0.12345 / 0.01 = 12.34500 - 1.2345 / 0.01 = 123.45000 - 12.345 / 0.01 = 1234.50000 - 123.45 / 0.01 = 12345.00000 -0.012345 / 0.1 = 0.12345 - 0.12345 / 0.1 = 1.23450 - 1.2345 / 0.1 = 12.34500 - 12.345 / 0.1 = 123.45000 - 123.45 / 0.1 = 1234.50000 -0.012345 / 1 = 0.01234 - 0.12345 / 1 = 0.12345 - 1.2345 / 1 = 1.23450 - 12.345 / 1 = 12.34500 - 123.45 / 1 = 123.45000 -0.012345 / 10 = 0.00123 - 0.12345 / 10 = 0.01234 - 1.2345 / 10 = 0.12345 - 12.345 / 10 = 1.23450 - 123.45 / 10 = 12.34500 -0.012345 / 100 = 0.00012 - 0.12345 / 100 = 0.00123 - 1.2345 / 100 = 0.01234 - 12.345 / 100 = 0.12345 - 123.45 / 100 = 1.23450 + 0.012345 / 0.01 = 1.23450 + 0.12345 / 0.01 = 12.34500 + 1.2345 / 0.01 = 123.45000 + 12.345 / 0.01 = 1234.50000 + 123.45 / 0.01 = 12345.00000 +-0.012345 / 0.01 = -1.23450 + -0.12345 / 0.01 = -12.34500 + -1.2345 / 0.01 = -123.45000 + -12.345 / 0.01 = -1234.50000 + -123.45 / 0.01 = -12345.00000 + 0.012345 / 0.1 = 0.12345 + 0.12345 / 0.1 = 1.23450 + 1.2345 / 0.1 = 12.34500 + 12.345 / 0.1 = 123.45000 + 123.45 / 0.1 = 1234.50000 +-0.012345 / 0.1 = -0.12345 + -0.12345 / 0.1 = -1.23450 + -1.2345 / 0.1 = -12.34500 + -12.345 / 0.1 = -123.45000 + -123.45 / 0.1 = -1234.50000 + 0.012345 / 1 = 0.01234 + 0.12345 / 1 = 0.12345 + 1.2345 / 1 = 1.23450 + 12.345 / 1 = 12.34500 + 123.45 / 1 = 123.45000 +-0.012345 / 1 = -0.01234 + -0.12345 / 1 = -0.12345 + -1.2345 / 1 = -1.23450 + -12.345 / 1 = -12.34500 + -123.45 / 1 = -123.45000 + 0.012345 / 10 = 0.00123 + 0.12345 / 10 = 0.01234 + 1.2345 / 10 = 0.12345 + 12.345 / 10 = 1.23450 + 123.45 / 10 = 12.34500 +-0.012345 / 10 = -0.00123 + -0.12345 / 10 = -0.01234 + -1.2345 / 10 = -0.12345 + -12.345 / 10 = -1.23450 + -123.45 / 10 = -12.34500 + 0.012345 / 100 = 0.00012 + 0.12345 / 100 = 0.00123 + 1.2345 / 100 = 0.01234 + 12.345 / 100 = 0.12345 + 123.45 / 100 = 1.23450 +-0.012345 / 100 = -0.00012 + -0.12345 / 100 = -0.00123 + -1.2345 / 100 = -0.01234 + -12.345 / 100 = -0.12345 + -123.45 / 100 = -1.23450 + 0.012345 / -0.01 = -1.23450 + 0.12345 / -0.01 = -12.34500 + 1.2345 / -0.01 = -123.45000 + 12.345 / -0.01 = -1234.50000 + 123.45 / -0.01 = -12345.00000 +-0.012345 / -0.01 = 1.23450 + -0.12345 / -0.01 = 12.34500 + -1.2345 / -0.01 = 123.45000 + -12.345 / -0.01 = 1234.50000 + -123.45 / -0.01 = 12345.00000 + 0.012345 / -0.1 = -0.12345 + 0.12345 / -0.1 = -1.23450 + 1.2345 / -0.1 = -12.34500 + 12.345 / -0.1 = -123.45000 + 123.45 / -0.1 = -1234.50000 +-0.012345 / -0.1 = 0.12345 + -0.12345 / -0.1 = 1.23450 + -1.2345 / -0.1 = 12.34500 + -12.345 / -0.1 = 123.45000 + -123.45 / -0.1 = 1234.50000 + 0.012345 / -1 = -0.01234 + 0.12345 / -1 = -0.12345 + 1.2345 / -1 = -1.23450 + 12.345 / -1 = -12.34500 + 123.45 / -1 = -123.45000 +-0.012345 / -1 = 0.01234 + -0.12345 / -1 = 0.12345 + -1.2345 / -1 = 1.23450 + -12.345 / -1 = 12.34500 + -123.45 / -1 = 123.45000 + 0.012345 / -10 = -0.00123 + 0.12345 / -10 = -0.01234 + 1.2345 / -10 = -0.12345 + 12.345 / -10 = -1.23450 + 123.45 / -10 = -12.34500 +-0.012345 / -10 = 0.00123 + -0.12345 / -10 = 0.01234 + -1.2345 / -10 = 0.12345 + -12.345 / -10 = 1.23450 + -123.45 / -10 = 12.34500 + 0.012345 / -100 = -0.00012 + 0.12345 / -100 = -0.00123 + 1.2345 / -100 = -0.01234 + 12.345 / -100 = -0.12345 + 123.45 / -100 = -1.23450 +-0.012345 / -100 = 0.00012 + -0.12345 / -100 = 0.00123 + -1.2345 / -100 = 0.01234 + -12.345 / -100 = 0.12345 + -123.45 / -100 = 1.23450