สิ่งหนึ่งที่ผมอยากจะเห็นจะได้รับการยอมรับว่าdouble
จะfloat
ควรจะได้รับการยกย่องว่าเป็นแปลงขยับขยายในขณะfloat
ที่จะdouble
มีการกวดขัน (*) ที่อาจดูเหมือนเคาน์เตอร์ง่าย แต่พิจารณาประเภทที่จริงหมายถึง:
- 0.1f หมายถึง "13,421,773.5 / 134,217,728 บวกหรือลบ 1 / 268,435,456 หรือมากกว่านั้น"
- 0.1 หมายถึงจริงๆ 3,602,879,701,896,397 / 36,028,797,018,963,968 บวกหรือลบ 1 / 72,057,594,037,927,936 หรือประมาณ "
หากหนึ่งมีdouble
ที่ถือเป็นตัวแทนที่ดีที่สุดของปริมาณ "หนึ่งในสิบ" และแปลงfloat
เป็นผลลัพธ์จะเป็น "13,421,773.5 / 134,217,728 บวกหรือลบ 1 / 268,435,456 หรือซึ่งเป็นคำอธิบายที่ถูกต้องของค่า
ในทางตรงกันข้ามหากมีสิ่งfloat
ใดที่มีตัวแทนที่ดีที่สุดของปริมาณ "หนึ่งในสิบ" และแปลงdouble
เป็นผลลัพธ์จะเป็น "13,421,773.5 / 134,217,728 บวกหรือลบ 1 / 72,057,594,037,927,936 หรือนัยอื่น ๆ " - ระดับความแม่นยำโดยนัย ซึ่งผิดโดยมีปัจจัยมากกว่า 53 ล้าน
แม้ว่ามาตรฐาน IEEE-744 กำหนดให้ต้องดำเนินการทางคณิตศาสตร์แบบเลขทศนิยมเนื่องจากเลขทศนิยมทุกตัวจะแสดงปริมาณตัวเลขที่แน่นอนที่กึ่งกลางของช่วงนั้นอย่างแม่นยำ แต่ไม่ควรนำมาใช้เพื่อบ่งบอกว่าค่าจุดลอยตัวเป็นตัวแทนของความถูกต้องแน่นอน ปริมาณเชิงตัวเลข แต่ความต้องการที่ค่าจะถือว่าเป็นศูนย์กลางของช่วงของพวกเขาเกิดขึ้นจากข้อเท็จจริงสามประการ: (1) การคำนวณจะต้องดำเนินการราวกับว่าตัวถูกดำเนินการมีค่าที่แม่นยำเฉพาะบางอย่าง; (2) สมมติฐานที่สอดคล้องและมีเอกสารเป็นประโยชน์มากกว่าสมมติฐานที่ไม่สอดคล้องกันหรือไม่มีเอกสาร (3) ถ้ามีใครจะทำให้สมมติฐานที่สอดคล้องกันไม่มีสมมติฐานที่สอดคล้องกันอื่น ๆ จะดีกว่าสมมติว่าปริมาณหมายถึงจุดศูนย์กลางของช่วง
ฉันจำได้เมื่อ 25 ปีที่แล้วบางคนคิดแพ็กเกจตัวเลขสำหรับ C ซึ่งใช้ "range range" ซึ่งแต่ละอันประกอบด้วย 128-bit float; การคำนวณทั้งหมดจะทำในลักษณะที่จะคำนวณค่าต่ำสุดและสูงสุดที่เป็นไปได้สำหรับแต่ละผลลัพธ์ หากทำการคำนวณซ้ำขนาดใหญ่เป็นเวลานานและมีค่าเป็น [12.53401391134 12.53902812673] ก็สามารถมั่นใจได้ว่าในขณะที่ความแม่นยำจำนวนมากหายไปจากข้อผิดพลาดในการปัดเศษผลลัพธ์จะยังคงแสดงได้อย่างสมเหตุสมผลเท่ากับ 12.54 (และเป็น ' 12.9 หรือ 53.2) ฉันประหลาดใจที่ฉันไม่ได้เห็นการสนับสนุนประเภทดังกล่าวในภาษากระแสหลักใด ๆ โดยเฉพาะอย่างยิ่งเนื่องจากพวกเขาดูเหมือนจะเหมาะสมกับหน่วยคณิตศาสตร์ที่สามารถทำงานกับค่าหลายค่าในแบบคู่ขนาน
(*) ในทางปฏิบัติมักจะมีประโยชน์ในการใช้ค่าความแม่นยำสองเท่าเพื่อเก็บการคำนวณระดับกลางเมื่อทำงานกับตัวเลขที่มีความแม่นยำเดียวดังนั้นการใช้ typecast สำหรับการดำเนินการทั้งหมดอาจน่ารำคาญ ภาษาสามารถช่วยได้ด้วยการพิมพ์ "fuzzy double" ซึ่งจะทำการคำนวณเป็นสองเท่าและสามารถส่งไปและกลับจากเดี่ยวได้อย่างอิสระ สิ่งนี้จะเป็นประโยชน์อย่างยิ่งหากฟังก์ชันที่รับพารามิเตอร์ประเภทdouble
และการส่งคืนdouble
สามารถทำเครื่องหมายเพื่อให้พวกเขาสร้างโอเวอร์โหลดที่ยอมรับและส่งคืน "fuzzy double" โดยอัตโนมัติแทน