authorgravatar for brett@lintonhill.comBrett Hill <brett@lintonhill.com> 2023-05-05 16:02:22+10:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-10 16:01:17+03:00
log37f56a425949ffb71ec412e298ccd70748c65cc3
tree29b52f6e74a124d3dd99c79546c5c9bc3f050dc5
parent0972196f4d9e583a1086a5cba41bf7918b1962c0

Issue 15535. Normalize remainder in math.big.int.Managed.divTrunc


2 files changed, 14 insertions(+), 1 deletions(-)

lib/std/math/big/int.zig+1-1
......@@ -1519,7 +1519,7 @@ pub const Mutable = struct {
15191519 r.positive = r_positive;
15201520 }
15211521
1522 if (xy_trailing != 0) {
1522 if (xy_trailing != 0 and r.limbs[r.len - 1] != 0) {
15231523 // Manually shift here since we know its limb aligned.
15241524 mem.copyBackwards(Limb, r.limbs[xy_trailing..], r.limbs[0..r.len]);
15251525 @memset(r.limbs[0..xy_trailing], 0);
lib/std/math/big/int_test.zig+13
......@@ -1373,6 +1373,19 @@ test "big.int div trunc single-single -/-" {
13731373 try testing.expect((try r.to(i32)) == er);
13741374}
13751375
1376test "big.int divTrunc #15535" {
1377 var one = try Managed.initSet(testing.allocator, 1);
1378 defer one.deinit();
1379 var x = try Managed.initSet(testing.allocator, std.math.pow(u128, 2, 64));
1380 defer x.deinit();
1381 var r = try Managed.init(testing.allocator);
1382 defer r.deinit();
1383 var q = try Managed.init(testing.allocator);
1384 defer q.deinit();
1385 try q.divTrunc(&r, &x, &x);
1386 try testing.expect(r.order(one) == std.math.Order.lt);
1387}
1388
13761389test "big.int divFloor #10932" {
13771390 var a = try Managed.init(testing.allocator);
13781391 defer a.deinit();