From a484e2e7da6c7ca2b47dddb0f9f6937460dfcc8f Mon Sep 17 00:00:00 2001 From: AdrienBouvais Date: Tue, 21 Apr 2026 11:43:29 +0200 Subject: [PATCH] Optimized length to be optimized for int --- src/main.zig | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main.zig b/src/main.zig index 3e616c9..3115890 100644 --- a/src/main.zig +++ b/src/main.zig @@ -288,23 +288,18 @@ pub fn QuantityVec3(Q: type) type { } pub fn length(self: Self) T { - if (comptime hlp.isInt(T)) - return self.isqrt() - else - return @sqrt(self.x * self.x + self.y * self.y + self.z * self.z); - } + const len_sq = self.lengthSqr(); - fn isqrt(self: Self) T { - const squared_sum = (self.x * self.x) + (self.y * self.y) + (self.z * self.z); - if (squared_sum <= 0) return 0; + if (comptime @typeInfo(T) == .int) { + // Construct the unsigned equivalent of T at comptime (e.g., i32 -> u32) + const UnsignedT = @Int(.unsigned, @typeInfo(T).int.bits); - var x = squared_sum; - var y = @divTrunc(x + 1, 2); - while (y < x) { - x = y; - y = @divTrunc(x + @divTrunc(squared_sum, x), 2); + // len_sq is always positive, so @intCast is perfectly safe + const u_len_sq = @as(UnsignedT, @intCast(len_sq)); + return @as(T, @intCast(std.math.sqrt(u_len_sq))); + } else { + return @sqrt(len_sq); } - return x; } }; }