@@ -439,8 +439,41 @@ bool bc_divide_ex(bc_num numerator, bc_num divisor, bc_num *quot, bc_num *rem, s
439
439
(* quot )-> n_sign = numerator -> n_sign == divisor -> n_sign ? PLUS : MINUS ;
440
440
}
441
441
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 ;
442
453
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
+ }
444
477
}
445
478
446
479
/* Size that can be read from numeratorptr */
0 commit comments