We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 12c20e3 commit 6e271b2Copy full SHA for 6e271b2
2 files changed
vlib/math/big/big_test.v
@@ -248,6 +248,20 @@ struct DivModTest {
248
249
// vfmt off
250
const div_mod_test_data = [
251
+ DivModTest{0, 7, 0, 0},
252
+ DivModTest{0, -7, 0, 0},
253
+ DivModTest{3, 7, 0, 3},
254
+ DivModTest{-3, -7, 0, -3},
255
+ DivModTest{-3, 7, 0, -3},
256
+ DivModTest{3, -7, 0, 3},
257
+ DivModTest{7, 3, 2, 1},
258
+ DivModTest{-7, -3, 2, -1},
259
+ DivModTest{-7, 3, -2, -1},
260
+ DivModTest{7, -3, -2, 1},
261
+ DivModTest{8, 2, 4, 0},
262
+ DivModTest{-8, -2, 4, 0},
263
+ DivModTest{-8, 2, -4, 0},
264
+ DivModTest{8, -2, -4, 0},
265
DivModTest{13, 10, 1, 3},
266
DivModTest{13, 9, 1, 4},
267
DivModTest{7, 5, 1, 2},
vlib/math/big/integer.v
@@ -415,38 +415,31 @@ pub fn (multiplicand Integer) * (multiplier Integer) Integer {
415
//
416
// DO NOT use this method if the divisor has any chance of being 0.
417
fn (dividend Integer) div_mod_internal(divisor Integer) (Integer, Integer) {
418
- $if debug {
419
- assert divisor.signum != 0
420
- }
421
-
422
- if dividend.signum == 0 {
423
- return zero_int, zero_int
424
425
- if divisor == one_int {
426
- return dividend.clone(), zero_int
427
428
- if divisor.signum == -1 {
429
- q, r := dividend.div_mod_internal(divisor.neg())
430
- return q.neg(), r
431
432
- if dividend.signum == -1 {
433
- q, r := dividend.neg().div_mod_internal(divisor)
434
- if r.signum == 0 {
435
- return q.neg(), zero_int
436
- } else {
437
- return q.neg() - one_int, divisor - r
438
439
440
- // Division for positive integers
441
mut q := []u32{cap: int_max(1, dividend.digits.len - divisor.digits.len + 1)}
442
mut r := []u32{cap: dividend.digits.len}
+ mut q_signum := 0
+ mut r_signum := 0
+
443
divide_digit_array(dividend.digits, divisor.digits, mut q, mut r)
+ if dividend.signum > 0 && divisor.signum > 0 {
+ q_signum = 1
+ r_signum = 1
+ } else if dividend.signum > 0 && divisor.signum < 0 {
+ q_signum = -1
+ } else if dividend.signum < 0 && divisor.signum > 0 {
+ r_signum = -1
+ } else {
+ }
444
quotient := Integer{
445
- signum: if q.len == 0 { 0 } else { 1 }
+ signum: if q.len == 0 { 0 } else { q_signum }
446
digits: q
447
}
448
remainder := Integer{
449
- signum: if r.len == 0 { 0 } else { 1 }
+ signum: if r.len == 0 { 0 } else { r_signum }
450
digits: r
451
452
return quotient, remainder
0 commit comments