Skip to content

Commit 67b28bc

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

File tree

1 file changed

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

1 file changed

+37
-1
lines changed

ext/bcmath/libbcmath/src/div.c

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,8 +439,44 @@ 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;
453+
454+
size_t rem_size = 0;
455+
size_t numerator_rem_len_diff = 0;
442456
if (use_rem) {
443-
/* TODO: create bc_num for rem */
457+
size_t divisor_frac_size = divisor->n_scale > divisor_trailing_zeros ? divisor->n_scale - divisor_trailing_zeros : 0;
458+
rem_scale = MIN(MAX(numerator->n_scale, divisor_frac_size), rem_scale);
459+
*rem = bc_new_num_nonzeroed(divisor->n_len, rem_scale);
460+
(*rem)->n_sign = numerator->n_sign;
461+
462+
if (divisor_frac_size > rem_scale) {
463+
rem_over_size = divisor_frac_size - rem_scale;
464+
rem_write_size = (*rem)->n_len + rem_scale;
465+
} else {
466+
if (divisor_frac_size > 0) {
467+
rem_write_size = (*rem)->n_len + divisor_frac_size;
468+
} else {
469+
/* e.g. 100 % 30 */
470+
rem_write_size = (*rem)->n_len - (divisor_trailing_zeros - divisor->n_scale);
471+
}
472+
}
473+
474+
rem_size = (*rem)->n_len + (*rem)->n_scale;
475+
if (rem_size > rem_write_size) {
476+
size_t copy_size = rem_size - rem_write_size;
477+
numerator_rem_len_diff = numerator->n_len - (*rem)->n_len;
478+
memcpy((*rem)->n_value + rem_write_size, numerator->n_value + rem_write_size + numerator_rem_len_diff, copy_size);
479+
}
444480
}
445481

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

0 commit comments

Comments
 (0)