DataView.getFloat64() คืออะไร
เมธอด DataView.prototype.getFloat64() ใช้สำหรับ อ่านค่าจำนวนจริง 64-bit (double precision floating point) จากตำแหน่งที่กำหนดใน DataView ตามมาตรฐาน IEEE 754 binary64 นี่คือรูปแบบเดียวกับชนิด number ของ JavaScript เอง
ไวยากรณ์ (Syntax)
dataView.getFloat64(byteOffset [, littleEndian])
byteOffset- ตำแหน่งเริ่มต้นในหน่วยไบต์ (0-indexed)littleEndian(optional) -true= little-endian,false= big-endian (default:false)
คืนค่า: จำนวนจริง 64-bit (JavaScript number)
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1: การอ่านค่าพื้นฐาน
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setFloat64(0, 654.44);
console.log(view.getFloat64(0)); // 654.44
ตัวอย่างที่ 2: การใช้ค่าคงที่ทางคณิตศาสตร์ (Math constants)
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setFloat64(0, Math.PI);
console.log(view.getFloat64(0)); // 3.141592653589793
view.setFloat64(0, Math.LOG2E);
console.log(view.getFloat64(0)); // 1.4426950408889634
view.setFloat64(0, Math.SQRT2);
console.log(view.getFloat64(0)); // 1.4142135623730951
ตัวอย่างที่ 3: การจัดการ Endianness
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer);
const value = Math.PI;
view.setFloat64(0, value, false); // big-endian
view.setFloat64(8, value, true); // little-endian
console.log('BE:', view.getFloat64(0, false)); // 3.14159...
console.log('LE:', view.getFloat64(8, true)); // 3.14159...
// อ่านแบบผิด endian จะได้ค่า nonsense
console.log('Wrong:', view.getFloat64(0, true)); // ค่าแปลกๆ
ตัวอย่างที่ 4: ค่าพิเศษ (Special Values)
const buffer = new ArrayBuffer(32);
const view = new DataView(buffer);
view.setFloat64(0, Infinity);
view.setFloat64(8, -Infinity);
view.setFloat64(16, NaN);
view.setFloat64(24, -0);
console.log(view.getFloat64(0)); // Infinity
console.log(view.getFloat64(8)); // -Infinity
console.log(view.getFloat64(16)); // NaN
console.log(view.getFloat64(24)); // -0 (แสดงเป็น 0 แต่ sign bit = 1)
console.log(1 / view.getFloat64(24)); // -Infinity (ยืนยันว่าเป็น -0 จริง)
ตัวอย่างที่ 5: อ่านค่าที่ยังไม่ได้ตั้งค่า
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
console.log(view.getFloat64(0)); // NaN (ไม่ใช่ 0 เหมือน integer types)
IEEE 754 Binary64 (Double Precision) Format
64-bit แบ่งเป็น:
- 1 bit - Sign (S)
- 11 bits - Exponent (E) - bias = 1023
- 52 bits - Mantissa/Significand (M) - implicit leading 1
ค่า = (-1)^S × 1.M × 2^(E-1023)
ความแตกต่างระหว่าง Float32 และ Float64
| คุณสมบัติ | Float32 (single) | Float64 (double) |
|---|---|---|
| ขนาด | 4 bytes (32 bits) | 8 bytes (64 bits) |
| Exponent bits | 8 | 11 |
| Mantissa bits | 23 | 52 |
| Precision (decimal digits) | ~7 | ~15-17 |
| Range | ~±3.4×10^38 | ~±1.8×10^308 |
| JavaScript number | ❌ ต้องแปลง | ✅ ตรงกัน |
กรณีการใช้งานทั่วไป
- Scientific computing: ความแม่นยำสูง สำหรับการคำนวณวิทยาศาสตร์
- Financial data: ราคาหุ้น, อัตราแลกเปลี่ยน (แต่ควรใช้ decimal library สำหรับเงินจริง)
- Graphics/WebGL: Vertex attributes, transformation matrices
- Serialization: แปลง JavaScript number เป็น binary และกลับมา
- Interop: รับส่ง double กับ C/C++, WebAssembly, databases
กรณีพิเศษและข้อผิดพลาด
- โยน
RangeErrorหากbyteOffsetติดลบ หรือbyteOffset + 8 > byteLength - คืนค่า
NaNหากอ่านจากตำแหน่งที่ไม่มีข้อมูล (ต่างจาก integer types ที่คืน 0) - Endianness สำคัญมาก - ต้องตรงกับรูปแบบที่เขียนไว้
- JavaScript number คือ Float64 ดังนั้นไม่มี precision loss ในการแปลง