Skip to content

Commit 1559297

Browse files
committed
Create a process to initialize bc_num of rem
1 parent 0390fd6 commit 1559297

File tree

1 file changed

+34
-1
lines changed
  • ext/bcmath/libbcmath/src

1 file changed

+34
-1
lines changed

ext/bcmath/libbcmath/src/div.c

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,8 +439,41 @@ bool bc_divide_ex(bc_num numerator, bc_num divisor, bc_num *quot, bc_num *rem, s
439439
(*quot)->n_sign = numerator->n_sign == divisor->n_sign ? PLUS : MINUS;
440440
}
441441

442+
/**
443+
* If the calculation uses more digits than the scale of rem, writing the vector directly to rem
444+
* will exceed the size, so calculate the excess size in advance.
445+
*/
446+
size_t rem_over_size = 0;
447+
448+
/**
449+
* Conversely, there are cases where the vector does not fill the rem size.
450+
* In this case, the size to be written is calculated in advance to determine the start position for writing to rem.
451+
*/
452+
size_t rem_write_size = 0;
442453
if (use_rem) {
443-
/* TODO: create bc_num for rem */
454+
size_t divisor_frac_size = divisor->n_scale > divisor_trailing_zeros ? divisor->n_scale - divisor_trailing_zeros : 0;
455+
rem_scale = MIN(MAX(numerator->n_scale, divisor_frac_size), rem_scale);
456+
*rem = bc_new_num_nonzeroed(divisor->n_len, rem_scale);
457+
(*rem)->n_sign = numerator->n_sign;
458+
459+
if (divisor_frac_size > rem_scale) {
460+
rem_over_size = divisor_frac_size - rem_scale;
461+
rem_write_size = (*rem)->n_len + rem_scale;
462+
} else {
463+
if (divisor_frac_size > 0) {
464+
rem_write_size = (*rem)->n_len + divisor_frac_size;
465+
} else {
466+
/* e.g. 100 % 30 */
467+
rem_write_size = (*rem)->n_len - (divisor_trailing_zeros - divisor->n_scale);
468+
}
469+
}
470+
471+
size_t rem_size = (*rem)->n_len + (*rem)->n_scale;
472+
if (rem_size > rem_write_size) {
473+
size_t copy_size = rem_size - rem_write_size;
474+
size_t len_diff = numerator->n_len - (*rem)->n_len;
475+
memcpy((*rem)->n_value + rem_write_size, numerator->n_value + rem_write_size + len_diff, copy_size);
476+
}
444477
}
445478

446479
/* Size that can be read from numeratorptr */

0 commit comments

Comments
 (0)