struct Backend64_TablesSmall [src]

Source

pub const Backend64_TablesSmall = struct { const T = u64; const mulShift = mulShift64; const POW5_INV_BITCOUNT = FLOAT64_POW5_INV_BITCOUNT; const POW5_BITCOUNT = FLOAT64_POW5_BITCOUNT; const bound1 = 21; const bound2 = 63; const adjust_q = false; fn computePow5(i: u32) [2]u64 { const base = i / FLOAT64_POW5_TABLE_SIZE; const base2 = base * FLOAT64_POW5_TABLE_SIZE; const mul = &FLOAT64_POW5_SPLIT2[base]; if (i == base2) { return .{ mul[0], mul[1] }; } else { const offset = i - base2; const m = FLOAT64_POW5_TABLE[offset]; const b0 = @as(u128, m) * mul[0]; const b2 = @as(u128, m) * mul[1]; const delta: u7 = @intCast(pow5Bits(i) - pow5Bits(base2)); const shift: u5 = @intCast((i % 16) << 1); const shifted_sum = ((b0 >> delta) + (b2 << (64 - delta))) + 1 + ((FLOAT64_POW5_OFFSETS[i / 16] >> shift) & 3); return .{ @truncate(shifted_sum), @truncate(shifted_sum >> 64) }; } } fn computeInvPow5(i: u32) [2]u64 { const base = (i + FLOAT64_POW5_TABLE_SIZE - 1) / FLOAT64_POW5_TABLE_SIZE; const base2 = base * FLOAT64_POW5_TABLE_SIZE; const mul = &FLOAT64_POW5_INV_SPLIT2[base]; // 1 / 5^base2 if (i == base2) { return .{ mul[0], mul[1] }; } else { const offset = base2 - i; const m = FLOAT64_POW5_TABLE[offset]; // 5^offset const b0 = @as(u128, m) * (mul[0] - 1); const b2 = @as(u128, m) * mul[1]; // 1/5^base2 * 5^offset = 1/5^(base2-offset) = 1/5^i const delta: u7 = @intCast(pow5Bits(base2) - pow5Bits(i)); const shift: u5 = @intCast((i % 16) << 1); const shifted_sum = ((b0 >> delta) + (b2 << (64 - delta))) + 1 + ((FLOAT64_POW5_INV_OFFSETS[i / 16] >> shift) & 3); return .{ @truncate(shifted_sum), @truncate(shifted_sum >> 64) }; } } }