@@ -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