@@ -439,8 +439,44 @@ 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 ;
453
+
454
+ size_t rem_size = 0 ;
455
+ size_t numerator_rem_len_diff = 0 ;
442
456
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
+ }
444
480
}
445
481
446
482
/* Size that can be read from numeratorptr */
0 commit comments