DoxigAlpha

formatNumber

If the absolute value of integer is greater than or equal to pow(2, 64 * @sizeOf(usize) * 8), this function will fail to print the string, printing "(BigInt)" instead of a number. This is because the rendering algorithm requires reversing a string, which requires O(N) memory. See toString and toStringAlloc for a way to print big integers without failure.

Function parameters

Parameters

#
w:*std.io.Writer
number:std.fmt.Number

Used to indicate either limit of a 2s-complement integer.

Types

#
TwosCompIntLimit
Used to indicate either limit of a 2s-complement integer.
Mutable
A arbitrary-precision big integer, with a fixed set of mutable limbs.
Const
A arbitrary-precision big integer, with a fixed set of immutable limbs.
Managed
An arbitrary-precision big integer along with an allocator which manages the memory.

Returns the number of limbs needed to store `scalar`, which must be a

Functions

#
calcLimbLen
Returns the number of limbs needed to store `scalar`, which must be a
calcSetStringLimbCount
Assumes `string_len` doesn't account for minus signs if the number is negative.
calcNonZeroTwosCompLimbCount
Compute the number of limbs required to store a 2s-complement number of `bit_count` bits.
calcTwosCompLimbCount
Compute the number of limbs required to store a 2s-complement number of `bit_count` bits.
addMulLimbWithCarry
a + b * c + *carry, sets carry to the overflow bits
llcmp
Returns -1, 0, 1 if |a| < |b|, |a| == |b| or |a| > |b| respectively for limbs.

Source

Implementation

#
pub fn formatNumber(self: Const, w: *std.io.Writer, number: std.fmt.Number) std.io.Writer.Error!void {
    const available_len = 64;
    if (self.limbs.len > available_len)
        return w.writeAll("(BigInt)");

    var limbs: [calcToStringLimbsBufferLen(available_len, 10)]Limb = undefined;

    const biggest: Const = .{
        .limbs = &([1]Limb{comptime math.maxInt(Limb)} ** available_len),
        .positive = false,
    };
    var buf: [biggest.sizeInBaseUpperBound(2)]u8 = undefined;
    const base: u8 = number.mode.base() orelse @panic("TODO print big int in scientific form");
    const len = self.toString(&buf, base, number.case, &limbs);
    return w.writeAll(buf[0..len]);
}