ประเภทที่เก็บตัวเลขที่มีทศนิยม – float, double
ชนิดข้อมูลเหล่านี้มักเรียกว่าชนิดข้อมูลทศนิยม ตัวเลขนี้เรียกว่า ตัวเลขทศนิยม
fvar ลอย = 50.15; double dvar = 50.0;
เปรียบเทียบประเภทข้อมูลทศนิยม – ทศนิยมและสองเท่า
ความแตกต่างระหว่างประเภทข้อมูลทศนิยมและทศนิยมนั้นเกี่ยวกับความแม่นยำใน # ของตำแหน่งทศนิยม
ตาม VexOS – ข้อกำหนด ARM 7float สามารถรองรับได้ 6 หรือ 7 แห่ง และ double can handle 15 หรือ 16 แห่ง .
float: ใน V5os ปัจจุบัน ดูเหมือนว่าคอนโทรลเลอร์จะอนุญาตให้มีตำแหน่งทศนิยมได้ถึง 8 ตำแหน่ง
เช่น.
ลอย fvar1 = 1.12345670; float fvar2 = 1.12345678;
fval1 แตกต่างจาก fvar2
เทียบกับ
ลอย fvar1 = 1.123456780; float fvar2 = 1.123456781;
fval1 จะถูกประเมินเหมือนกับ fvar2
double: อนุญาตให้มีตำแหน่งทศนิยมได้สูงสุด 17 ตำแหน่ง
เช่น.
dvar1 คู่ = 1.12345678912345678; double dvar2 = 1.12345678912345670;
dval1 แตกต่างจาก dvar2
เทียบกับ
dvar1 คู่ = 1.123456789123456789; double dvar2 = 1.123456789123456780;
dval1 จะถูกประเมินเหมือนกับ dvar2
อย่าใช้ "ดับเบิ้ล" เว้นแต่คุณต้องการความแม่นยำสูง
มีเหตุผลสองประการที่คุณไม่ควรใช้ "double" เว้นแต่ว่าคุณต้องการความแม่นยำสูง:
- ใช้ประเภททุ่นลอยน้ำ 2X
- ใช้พลังการประมวลผลที่สูงกว่ามาก
ตาม VexOS – ข้อกำหนด ARM 7float สามารถทำได้ 6 หรือ 7 แห่ง และ double สามารถรองรับ 15 หรือ 16. ไม่ว่าในกรณีใด คุณไม่ควรพึ่งพาความถูกต้องของตัวเลขสุดท้ายเป็นเลขคู่หรือเลขทศนิยม มันถูกเก็บไว้แตกต่างอย่างมากจากการจัดเก็บ "int" เนื่องจากสิ่งที่เรียกว่า "การคำนวณจุดลอยตัว" (ซึ่งอยู่นอกขอบเขตของบทความนี้)
ดังนั้น คุณอาจสูญเสียความแม่นยำในทศนิยมสองสามตำแหน่งสุดท้าย
การดำเนินการกับ double มีค่าใช้จ่ายค่อนข้างสูงเมื่อเทียบกับ float และสูงกว่า "integer" มากเนื่องจากสิ่งที่เรียกว่าการคำนวณจุดลอยตัว
ตามมาตรฐาน IEEE รายการต่อไปนี้อยู่ในช่วงที่เชื่อถือได้มากขึ้น
พิมพ์ | ค่าบวกที่น้อยที่สุด | ค่าบวกที่ใหญ่ที่สุด | #ของความแม่นยำ |
ลอย | 10 -38 x 1.17549 | 10 38 x 3.40282 | 6 หลัก |
สองเท่า | 10 -308 หรือ 2.22507 | 10 308 x 1.79769 | 15 หลัก |
คุณสามารถแลกเปลี่ยนชนิดข้อมูลดั้งเดิมได้หรือไม่? - การคัดเลือกนักแสดง
เป็นไปได้ที่จะแลกเปลี่ยนประเภทข้อมูล เทคนิคนี้เรียกว่า “การหล่อ” แม้ว่าการคัดเลือกนักแสดงจะเป็นเรื่องปกติ แต่ให้ทำเฉพาะเมื่อจำเป็นเท่านั้น
แนวทางปฏิบัติทั่วไปประการหนึ่งคือการแลกเปลี่ยนอักขระและ int
เนื่องจากทั้งสองแสดงค่าจำนวนเต็มโดยมีข้อยกเว้นเพียงอย่างเดียว:
- “int” มี 4 ไบต์ (หรือ 8 ไบต์ในคอมไพเลอร์บางตัว)
- “ถ่าน” มีเพียง 1 ไบต์
ดังนั้น เช่น
ถ่าน aVal = 100; int iVal = aVal; // หล่อโดยปริยาย
หรือ
int iVal = (ถ่าน) aVal; //แคสติ้งชัดๆ
ข้อควรระวังสำหรับการตัดทอนโดยนัย:
เช่น.
การปฏิบัติทั่วไปอีกประการหนึ่งคือการแลกเปลี่ยน int และ float
ลอย fVal = 5.486; เศษส่วนลอย = fVal - (int)fVal; // มันทำ: 5.486 - 5
ข้อควรระวังสำหรับการตัดทอนโดยนัย:
เช่น.
int iVal = 50; float fVal = iVal / 100;
ตอนนี้ fVal = 0.0 ไม่ใช่ 0.5
เป็นการดีอย่างยิ่งที่จะใช้ประโยชน์จากการตัดทอนโดยนัย ซึ่งมักจะเป็นส่วนสำคัญของการดำเนินการในบางสถานการณ์ อย่างไรก็ตาม คุณต้องแน่ใจว่าคุณใช้เทคนิคนี้โดยการออกแบบ
หากคุณไม่ต้องการให้มีการตัดทอนโดยนัย คุณต้องทำการแคสต์อย่างชัดแจ้ง:
- การคัดเลือกโดยปริยาย:
float fVal = iVal / 100.0;
- การคัดเลือกนักแสดงอย่างชัดเจน:
float fVal = (float) iVal / 100