Commit 37f56a4259

Brett Hill <brett@lintonhill.com>
2023-05-05 08:02:22
Issue 15535. Normalize remainder in math.big.int.Managed.divTrunc
1 parent 0972196
Changed files (2)
lib
std
lib/std/math/big/int.zig
@@ -1519,7 +1519,7 @@ pub const Mutable = struct {
             r.positive = r_positive;
         }
 
-        if (xy_trailing != 0) {
+        if (xy_trailing != 0 and r.limbs[r.len - 1] != 0) {
             // Manually shift here since we know its limb aligned.
             mem.copyBackwards(Limb, r.limbs[xy_trailing..], r.limbs[0..r.len]);
             @memset(r.limbs[0..xy_trailing], 0);
lib/std/math/big/int_test.zig
@@ -1373,6 +1373,19 @@ test "big.int div trunc single-single -/-" {
     try testing.expect((try r.to(i32)) == er);
 }
 
+test "big.int divTrunc #15535" {
+    var one = try Managed.initSet(testing.allocator, 1);
+    defer one.deinit();
+    var x = try Managed.initSet(testing.allocator, std.math.pow(u128, 2, 64));
+    defer x.deinit();
+    var r = try Managed.init(testing.allocator);
+    defer r.deinit();
+    var q = try Managed.init(testing.allocator);
+    defer q.deinit();
+    try q.divTrunc(&r, &x, &x);
+    try testing.expect(r.order(one) == std.math.Order.lt);
+}
+
 test "big.int divFloor #10932" {
     var a = try Managed.init(testing.allocator);
     defer a.deinit();