ตัวดำเนินการ
ภาษาซีรองรับตัวดำเนินการหลายประเภท
ซึ่งเป็นสัญลักษณ์ที่ใช้ในนิพจน์เพื่อระบุการจัดการที่จะถูกทำให้เกิดผล
ระหว่างการประเมินค่าของนิพจน์นั้น ภาษาซีมีตัวดำเนินการต่อไปนี้
·
การกำหนดค่า
(=)
·
การประเมินค่าเชิงเงื่อนไข
(?:)
·
การรวมอาร์กิวเมนต์ฟังก์ชัน
(( ))
·
การเลือกสมาชิกในวัตถุ
(., ->)
·
การอ้างอิงและการถูกอ้างอิง
(&, *, [ ])
·
การลำดับ
(,)
·
การจัดกลุ่มนิพจน์ย่อย
(( ))
ภาษาซีมีไวยากรณ์รูปนัยซึ่งระบุโดยมาตรฐานภาษาซี
[13]
การแปลงจำนวนเต็ม จำนวนจุดลอยตัว และการปัดเศษ
วากยสัมพันธ์ของการแปลงชนิดข้อมูลสามารถใช้แปลงค่าต่าง ๆ
ระหว่างชนิดข้อมูลจำนวนเต็มและจำนวนจุดลอยตัว (จำนวนทศนิยม)
หรือระหว่างจำนวนเต็มสองจำนวน หรือระหว่างจำนวนจุดลอยตัวสองจำนวนที่มีขนาดแตกต่างกัน
ตัวอย่างเช่น (long int)sqrt(1000.0), (double)(256*256) หรือ (float)sqrt(1000.0) เป็นต้น
การแปลงชนิดข้อมูลเป็นภาวะปริยายในหลายบริบทอาทิ
เมื่อกำหนดค่าให้กับตัวแปรหรือพารามิเตอร์ของฟังก์ชัน
หรือเมื่อใช้จำนวนจุดลอยตัวเป็นดัชนีของเวกเตอร์
หรือในการดำเนินการทางเลขคณิตที่มีตัวถูกดำเนินการเป็นข้อมูลคนละชนิดกัน
การแปลงค่าระหว่างจำนวนเต็มและจำนวนจุดลอยตัวโดยทั่วไป
จะเกิดการเปลี่ยนแปลงการเข้ารหัสระดับบิตไปยังขอบเขตที่เป็นไปได้เพื่อสงวนค่าจำนวนของตัวถูกดำเนินการนั้น
ไม่เหมือนกับการแปลงชนิดข้อมูลกรณีอื่น
(ซึ่งการเข้ารหัสระดับบิตของตัวถูกดำเนินการจะถูกตีความใหม่ตามชนิดเป้าหมายเพียงเท่านั้น)
โดยเฉพาะอย่างยิ่ง
การแปลงชนิดข้อมูลจากจำนวนเต็มไปเป็นจำนวนจุดลอยตัวจะคงไว้ซึ่งค่าจำนวนได้อย่างถูกต้อง
เว้นแต่ถ้าจำนวนบิตในชนิดเป้าหมายมีไม่เพียงพอ กรณีดังกล่าวจะทำให้บิตที่มีนัยสำคัญน้อยที่สุดสูญหายไป
ส่วนการแปลงชนิดข้อมูลจากจำนวนจุดลอยตัวไปเป็นจำนวนเต็มจะเกิดการตัดค่าหลังจุดทศนิยมอย่างหลีกเลี่ยงไม่ได้
(ค่าถูกปัดเศษเข้าหาศูนย์) สำหรับการปัดเศษชนิดอื่น
ภาษซี99ได้ระบุไว้แล้วในฟังก์ชันดังนี้ (ใน <math.h>)
·
round(): ปัดเศษไปยังจำนวนเต็มที่ใกล้สุด
·
rint(), nearbyint():
ปัดเศษตามทิศทางของจำนวนจุดลอยตัวปัจจุบัน
·
trunc(): ปัดเศษเข้าหาศูนย์
(เหมือนกับการแปลงชนิดข้อมูลเป็นจำนวนเต็ม)
ฟังก์ชันทั้งหมดนี้รับอาร์กิวเมนต์ double
และคืนค่าเป็น double ซึ่งต่อจากนี้ก็อาจแปลงชนิดข้อมูลเป็นจำนวนเต็มอีกทีหากจำเป็น
การแปลงชนิดข้อมูลจาก float ไปเป็น double
จะคงไว้ซึ่งค่าจำนวนได้อย่างถูกต้อง ในขณะที่การแปลงกลับ
ค่าจะถูกปัดเศษซึ่งมักเป็นการปัดเศษเข้าหาศูนย์ เพื่อให้พอดีกับจำนวนบิตที่น้อยลง
(เนื่องจาก float ก็มีช่วงเลขชี้กำลังที่น้อยกว่าด้วย การแปลงชนิดข้อมูลอาจให้ผลเป็นค่าอนันต์แทน)
ตัวแปลโปรแกรมบางโปรแกรมจะแปลงค่าของ float ไปเป็น double
โดยเบื้องหลังในบางบริบทเช่น พารามิเตอร์ของฟังก์ชันที่ประกาศเป็น float
ตามความเป็นจริงอาจส่งค่าเป็น double ก็ได้
เครื่องที่ทำตามมาตรฐานจำนวนจุดลอยตัวของ IEEE
เหตุการณ์การปัดเศษบางเหตุการณ์มีผลมาจากสถานะการปัดเศษปัจจุบัน
(ได้แก่การปัดเศษเลขคู่ การปัดเศษขึ้น การปัดเศษลง และการปัดเศษเข้าหาศูนย์)
ซึ่งอาจเรียกดูหรือตั้งค่าสถานะโดยใช้ฟังก์ชัน fegetround()/fesetround()
ที่นิยามไว้ใน <fenv.h>
ไม่มีความคิดเห็น:
แสดงความคิดเห็น