in src/webgpu/util/conversion.ts [375:416]
export function pack2x16float(x: number, y: number): (number | undefined)[] {
// Generates all possible valid u16 bit fields for a given f32 to f16 conversion.
// Assumes FTZ for both the f32 and f16 value is allowed.
const generateU16s = (n: number): readonly number[] => {
let contains_subnormals = isSubnormalNumberF32(n);
const n_f16s = correctlyRoundedF16(n);
contains_subnormals ||= n_f16s.some(isSubnormalNumberF16);
const n_u16s = n_f16s.map(f16 => {
workingDataF16[0] = f16;
return workingDataU16[0];
});
const contains_poszero = n_u16s.some(u => u === kBit.f16.positive.zero);
const contains_negzero = n_u16s.some(u => u === kBit.f16.negative.zero);
if (!contains_negzero && (contains_poszero || contains_subnormals)) {
n_u16s.push(kBit.f16.negative.zero);
}
if (!contains_poszero && (contains_negzero || contains_subnormals)) {
n_u16s.push(kBit.f16.positive.zero);
}
return n_u16s;
};
if (!isFiniteF16(x) || !isFiniteF16(y)) {
// This indicates any value is valid, so it isn't worth bothering
// calculating the more restrictive possibilities.
return [undefined];
}
const results = new Array<number>();
for (const p of cartesianProduct(generateU16s(x), generateU16s(y))) {
assert(p.length === 2, 'cartesianProduct of 2 arrays returned an entry with not 2 elements');
workingDataU16[0] = p[0];
workingDataU16[1] = p[1];
results.push(workingDataU32[0]);
}
return results;
}