// Smallest and largest SNaNs and QNaNs, with and without sign-bit set. const NaNs = [
0x7C01, 0x7DFF, 0x7E00, 0x7FFF,
0xFC01, 0xFDFF, 0xFE00, 0xFFFF,
];
const canonicalNaN = new Uint16Array(new Float16Array([NaN]).buffer)[0];
// Load from array so that Ion doesn't treat as constants. constTrue = [true, 1]; constFalse = [false, 0];
function f() {
let src_ui16 = new Uint16Array(1);
let dst_f16 = new Float16Array(1);
let dst_ui16 = new Uint16Array(dst_f16.buffer);
let dv = new DataView(src_ui16.buffer);
for (let i = 0; i < 100; ++i) {
let nan = NaNs[i % NaNs.length];
// Write to typed array, implicitly using native endian.
src_ui16[0] = nan;
dst_f16[0] = dv.getFloat16(0, nativeIsLittleEndian);
assertEq(dst_ui16[0], canonicalNaN);
// Write and read using big endian. |isLittleEndian| parameter is absent.
writeBE(src_ui16, nan);
dst_f16[0] = dv.getFloat16(0);
assertEq(dst_ui16[0], canonicalNaN);
// Write and read using big endian. |isLittleEndian| parameter is a constant.
writeBE(src_ui16, nan);
dst_f16[0] = dv.getFloat16(0, false);
assertEq(dst_ui16[0], canonicalNaN);
// Write and read using little endian. |isLittleEndian| parameter is a constant.
writeLE(src_ui16, nan);
dst_f16[0] = dv.getFloat16(0, true);
assertEq(dst_ui16[0], canonicalNaN);
// Write and read using big endian.
writeBE(src_ui16, nan);
dst_f16[0] = dv.getFloat16(0, False[i & 1]);
assertEq(dst_ui16[0], canonicalNaN);
// Write and read using little endian.
writeLE(src_ui16, nan);
dst_f16[0] = dv.getFloat16(0, True[i & 1]);
assertEq(dst_ui16[0], canonicalNaN);
}
}
for (let i = 0; i < 2; ++i) f();
}
testF16();
// Float32 function testF32() { function writeBE(ui32, value) {
let ui8 = new Uint8Array(ui32.buffer);
// Smallest and largest SNaNs and QNaNs, with and without sign-bit set. const NaNs = [
0x7F80_0001, 0x7FBF_FFFF, 0x7FC0_0000, 0x7FFF_FFFF,
0xFF80_0001, 0xFFBF_FFFF, 0xFFC0_0000, 0xFFFF_FFFF,
];
const canonicalNaN = new Uint32Array(new Float32Array([NaN]).buffer)[0];
// Load from array so that Ion doesn't treat as constants. constTrue = [true, 1]; constFalse = [false, 0];
function f() {
let src_ui32 = new Uint32Array(1);
let dst_f32 = new Float32Array(1);
let dst_ui32 = new Uint32Array(dst_f32.buffer);
let dv = new DataView(src_ui32.buffer);
for (let i = 0; i < 100; ++i) {
let nan = NaNs[i % NaNs.length];
// Write to typed array, implicitly using native endian.
src_ui32[0] = nan;
dst_f32[0] = dv.getFloat32(0, nativeIsLittleEndian);
assertEq(dst_ui32[0], canonicalNaN);
// Write and read using big endian. |isLittleEndian| parameter is absent.
writeBE(src_ui32, nan);
dst_f32[0] = dv.getFloat32(0);
assertEq(dst_ui32[0], canonicalNaN);
// Write and read using big endian. |isLittleEndian| parameter is a constant.
writeBE(src_ui32, nan);
dst_f32[0] = dv.getFloat32(0, false);
assertEq(dst_ui32[0], canonicalNaN);
// Write and read using little endian. |isLittleEndian| parameter is a constant.
writeLE(src_ui32, nan);
dst_f32[0] = dv.getFloat32(0, true);
assertEq(dst_ui32[0], canonicalNaN);
// Write and read using big endian.
writeBE(src_ui32, nan);
dst_f32[0] = dv.getFloat32(0, False[i & 1]);
assertEq(dst_ui32[0], canonicalNaN);
// Write and read using little endian.
writeLE(src_ui32, nan);
dst_f32[0] = dv.getFloat32(0, True[i & 1]);
assertEq(dst_ui32[0], canonicalNaN);
}
}
for (let i = 0; i < 2; ++i) f();
}
testF32();
// Float64 function testF64() { function writeBE(ui64, value) {
let ui8 = new Uint8Array(ui64.buffer);
// Smallest and largest SNaNs and QNaNs, with and without sign-bit set. const NaNs = [
0x7FF0_0000_0000_0001n, 0x7FF7_FFFF_FFFF_FFFFn, 0x7FF8_0000_0000_0000n, 0x7FFF_FFFF_FFFF_FFFFn,
0xFFF0_0000_0000_0001n, 0xFFF7_FFFF_FFFF_FFFFn, 0xFFF8_0000_0000_0000n, 0xFFFF_FFFF_FFFF_FFFFn,
];
const canonicalNaN = new BigUint64Array(new Float64Array([NaN]).buffer)[0];
// Load from array so that Ion doesn't treat as constants. constTrue = [true, 1]; constFalse = [false, 0];
function f() {
let src_ui64 = new BigUint64Array(1);
let dst_f64 = new Float64Array(1);
let dst_ui64 = new BigUint64Array(dst_f64.buffer);
let dv = new DataView(src_ui64.buffer);
for (let i = 0; i < 100; ++i) {
let nan = NaNs[i % NaNs.length];
// Write and read using big endian. |isLittleEndian| parameter is absent.
writeBE(src_ui64, nan);
dst_f64[0] = dv.getFloat64(0);
assertEq(dst_ui64[0], canonicalNaN);
// Write and read using big endian. |isLittleEndian| parameter is a constant.
writeBE(src_ui64, nan);
dst_f64[0] = dv.getFloat64(0, false);
assertEq(dst_ui64[0], canonicalNaN);
// Write and read using little endian. |isLittleEndian| parameter is a constant.
writeLE(src_ui64, nan);
dst_f64[0] = dv.getFloat64(0, true);
assertEq(dst_ui64[0], canonicalNaN);
// Write and read using big endian.
writeBE(src_ui64, nan);
dst_f64[0] = dv.getFloat64(0, False[i & 1]);
assertEq(dst_ui64[0], canonicalNaN);
// Write and read using little endian.
writeLE(src_ui64, nan);
dst_f64[0] = dv.getFloat64(0, True[i & 1]);
assertEq(dst_ui64[0], canonicalNaN);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.