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) };
}
}
}