diff --git a/core/math/math.odin b/core/math/math.odin index 3d0ab3c4e..957e1672b 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -2443,6 +2443,36 @@ hypot :: proc{ hypot_f64, hypot_f64le, hypot_f64be, } +@(require_results) +count_digits_of_base :: proc "contextless" (value: $T, $base: int) -> (digits: int) where intrinsics.type_is_integer(T) { + #assert(base >= 2, "base must be 2 or greater.") + + value := value + when !intrinsics.type_is_unsigned(T) { + value = abs(value) + } + + when base == 2 { + digits = max(1, 8 * size_of(T) - int(intrinsics.count_leading_zeros(value))) + } else when intrinsics.count_ones(base) == 1 { + free_bits := 8 * size_of(T) - int(intrinsics.count_leading_zeros(value)) + digits, free_bits = divmod(free_bits, intrinsics.constant_log2(base)) + if free_bits > 0 { + digits += 1 + } + digits = max(1, digits) + } else { + digits = 1 + base := cast(T)base + for value >= base { + value /= base + digits += 1 + } + } + + return +} + F16_DIG :: 3 F16_EPSILON :: 0.00097656 F16_GUARD :: 0