มาตรฐานที่ทุกอย่างในหน้านี้อ้างอิง
ทุกบิตที่คุณเห็นใน Episode 2 มาจาก IEEE 754 binary64 (หรือที่ JS เรียกว่า "double") — มาตรฐานสากลที่กำหนดว่าตัวเลขทศนิยมถูกเก็บเป็นบิตอย่างไร แบ่งเป็น sign (1 บิต) + exponent (11 บิต, biased ด้วย 1023) + mantissa/significand (52 บิต, มี implicit leading "1." ที่ไม่ถูกเก็บจริง)
- IEEE Std 754-2019 — IEEE Standard for Floating-Point Arithmetic (มาตรฐานฉบับทางการ)
- David Goldberg — "What Every Computer Scientist Should Know About Floating-Point Arithmetic" (ACM Computing Surveys, 1991) คำอธิบายฉบับอ่านง่ายที่สุดที่เคยมีมา
ทำไม 0.1 เก็บไม่ตรง (สรุปสั้นๆ)
0.1 ในฐานสองคือ 0.0001100110011... (repeating) ไม่จบไม่สิ้น เหมือน 1/3 ในฐานสิบ float64 มีที่เก็บแค่ 52 บิตหลังจุด เลยต้อง "ปัดเศษ" ตัดที่บิตสุดท้าย ค่าที่ได้จริงคือ 0.1000000000000000055511151231257827021181583404541015625 ซึ่งมากกว่า 0.1 จริงนิดเดียว — พอบวกกับ 0.2 (ที่ก็ถูกปัดเศษเหมือนกัน) ผลรวมเลยเพี้ยนไปจากที่ปัดเศษเป็น 0.3 ไว้พอดี
lib ที่เทสต์ไว้แน่นๆ
lib/bits.ts— แกะ float64 เป็น sign/exponent/mantissa ด้วยDataViewตรงๆ (fixture: 0.1, 1.0, -2.5, NaN, Infinity, -0, subnormal 5e-324)lib/exact.ts— แปลง field IEEE754 เป็น exact decimal string ด้วยBigIntล้วนๆ (เศษส่วนไบนารีทุกตัวจบพอดีในฐานสิบ เพราะ 1/2^k = 5^k/10^k) พิน fixture 0.1 กับ 0.5 ไว้กันรีเกรสlib/binfrac.ts— ผลรวมของบิต 1/2, 1/4, 1/8, ... ที่ผู้ใช้กดเปิด/ปิดใน Episode 3lib/money.ts— helper แปลงบาท↔สตางค์แบบ integer (มุมไทย) พร้อมเทสต์ที่โชว์ว่า 0.1+0.2 บาทพังตอนบวกแบบ float แต่ exact ตอนบวกผ่านสตางค์ int
ส่วน UI/สไตล์ทั้งหมดเป็นงานสร้างสรรค์ ไม่มี "ถูก/ผิด" แบบทดสอบอัตโนมัติได้ เลยไม่ได้เขียนเทสต์ครอบ
แหล่งอ้างอิงเคสอุบัติเหตุ (Episode 4)
- GAO/IMTEC-92-26 — Patriot Missile Defense: Software Problem Led to System Failure at Dhahran, Saudi Arabia
- Vancouver Stock Exchange — Wikipedia (ส่วน "Rounding error")
- ESA — Ariane 501: Presentation of Inquiry Board report
เจอบั๊กสยองของตัวเองมาบ้างไหม
ถ้าคุณเคยโดนบั๊กตระกูลนี้เล่นงาน (เงินเพี้ยน, เกมพัง, กราฟขยับผิด) แชร์เรื่องราวของคุณต่อได้เลย — แท็ก #FloatHorror พร้อมลิงก์หน้านี้ ให้ dev คนอื่นได้เห็นว่าไม่ได้มีแค่คุณคนเดียวที่เจอ