ประเภทที่เก็บตัวเลขที่มีทศนิยม – 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" เว้นแต่ว่าคุณต้องการความแม่นยำสูง:

  1. ใช้ประเภททุ่นลอยน้ำ 2X
  2. ใช้พลังการประมวลผลที่สูงกว่ามาก

ตาม 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; //แคสติ้งชัดๆ

ข้อควรระวังสำหรับการตัดทอนโดยนัย:

เช่น.

codesnippet3.png

การปฏิบัติทั่วไปอีกประการหนึ่งคือการแลกเปลี่ยน 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

For more information, help, and tips, check out the many resources at VEX Professional Development Plus