ผลต่างระหว่างรุ่นของ "ศูนย์มีเครื่องหมาย"

จากวิกิพีเดีย สารานุกรมเสรี
เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
Naisun (คุย | ส่วนร่วม)
ลืมเคาะ spacebar ระหว่าง MSB กับ (
Octahedron80 (คุย | ส่วนร่วม)
→‎การแทนในคอมพิวเตอร์: บิตขวาสุดคือบิตที่ 0
บรรทัด 5: บรรทัด 5:
== การแทนในคอมพิวเตอร์ ==
== การแทนในคอมพิวเตอร์ ==
[[ไฟล์:IEEE 754 Single Negative Zero.svg|thumb|right|400px|ลบศูนย์ในระบบการแทนจำนวนมีจุดทศนิยม IEEE 754 แบบ 32 บิต]]
[[ไฟล์:IEEE 754 Single Negative Zero.svg|thumb|right|400px|ลบศูนย์ในระบบการแทนจำนวนมีจุดทศนิยม IEEE 754 แบบ 32 บิต]]
ในระบบการแทนจำนวนแบบ 8 [[บิต]]ของจำนวนเต็มในคอมพิวเตอร์ โดยมีบิตที่ 8(ซ้ายสุด)เรียกว่า MSB (Most Significant Bit) เป็นบิตกำกับเครื่องหมาย อีก 7 บิตหลังจากนั้นเป็นบิตที่บอกค่า จำนวนลบศูนย์สามารถแทนด้วย[[เลขฐานสอง]] <code>10000000</code> และ[[ส่วนเติมเต็มหนึ่ง]] (ones' complement) ของจำนวนลบศูนย์คือ <code>11111111</code> ส่วนในระบบการแทนจำนวนมีจุดทศนิยมตามมาตรฐาน [[IEEE 754]] จำนวนลบศูนย์เขียนแทนด้วย เลขชี้กำลังและ[[แมนทิสซา]]ที่เท่ากับศูนย์ทั้งคู่ และบิตกำกับเครื่องหมายเป็นหนึ่ง (หมายถึงค่าลบ)
ในระบบการแทนจำนวนแบบ 8 [[บิต]]ของจำนวนเต็มในคอมพิวเตอร์ โดยมีบิตที่ 7 (หรือบิตซ้ายสุด) เรียกว่า MSB (Most Significant Bit) เป็นบิตกำกับเครื่องหมาย ส่วนที่เหลือคือบิตที่ 0-6 (บิตขวาสุดคือบิตที่ 0) เป็นตัวบอกค่า จำนวนลบศูนย์สามารถแทนด้วย[[เลขฐานสอง]] <code>10000000</code> และ[[ส่วนเติมเต็มหนึ่ง]] (ones' complement) ของจำนวนลบศูนย์คือ <code>11111111</code> ส่วนในระบบการแทนจำนวนมีจุดทศนิยมตามมาตรฐาน [[IEEE 754]] จำนวนลบศูนย์เขียนแทนด้วย เลขชี้กำลังและ[[แมนทิสซา]]ที่เท่ากับศูนย์ทั้งคู่ และบิตกำกับเครื่องหมายเป็นหนึ่ง (หมายถึงค่าลบ)


ข้อกำหนดการเข้ารหัสเลขคณิตฐานสิบทั่วไป (General Decimal Arithmetic) ของ[[ไอบีเอ็ม]] กำหนดให้จำนวนลบศูนย์สามารถแทนได้ด้วย เลขชี้กำลังที่เป็นค่าใดๆ ก็ได้ในช่วงที่อนุญาต (ต่างกับ IEEE 754 ที่ต้องเป็นศูนย์) สัมประสิทธิ์ (แมนทิสซา) จะต้องเป็นศูนย์ทั้งหมด และบิตกำกับเครื่องหมายจะต้องเป็นหนึ่ง
ข้อกำหนดการเข้ารหัสเลขคณิตฐานสิบทั่วไป (General Decimal Arithmetic) ของ[[ไอบีเอ็ม]] กำหนดให้จำนวนลบศูนย์สามารถแทนได้ด้วย เลขชี้กำลังที่เป็นค่าใดๆ ก็ได้ในช่วงที่อนุญาต (ต่างกับ IEEE 754 ที่ต้องเป็นศูนย์) สัมประสิทธิ์ (แมนทิสซา) จะต้องเป็นศูนย์ทั้งหมด และบิตกำกับเครื่องหมายจะต้องเป็นหนึ่ง

รุ่นแก้ไขเมื่อ 13:44, 26 กรกฎาคม 2552

−0 คือตัวแทนของ ลบศูนย์ (อังกฤษ: negative zero) เป็นจำนวนหนึ่งที่มีในระบบคอมพิวเตอร์ นอกเหนือจาก 0 ในระบบการแทนจำนวนมีเครื่องหมาย (signed number) สำหรับจำนวนเต็มบางระบบ และระบบการแทนจำนวนมีจุดทศนิยม (floating point) แทบทุกระบบ แต่ในทางคณิตศาสตร์นั้นไม่มีการแบ่งแยกศูนย์ที่เป็นลบหรือเป็นบวก ดังนั้น −0 จึงมีความหมาย "เทียบเท่า" กับ 0

สำหรับการใช้โดยทั่วไป −0 หมายถึงจำนวนลบที่สามารถปัดเศษขึ้นเป็นค่าศูนย์ หรือจำนวนลบที่เข้าใกล้ศูนย์ทางซ้าย วิทยาศาสตร์บางสาขาจำเป็นต้องใช้ค่า −0 ในการเก็บสถิติหรือการรายงานผล

การแทนในคอมพิวเตอร์

ลบศูนย์ในระบบการแทนจำนวนมีจุดทศนิยม IEEE 754 แบบ 32 บิต

ในระบบการแทนจำนวนแบบ 8 บิตของจำนวนเต็มในคอมพิวเตอร์ โดยมีบิตที่ 7 (หรือบิตซ้ายสุด) เรียกว่า MSB (Most Significant Bit) เป็นบิตกำกับเครื่องหมาย ส่วนที่เหลือคือบิตที่ 0-6 (บิตขวาสุดคือบิตที่ 0) เป็นตัวบอกค่า จำนวนลบศูนย์สามารถแทนด้วยเลขฐานสอง 10000000 และส่วนเติมเต็มหนึ่ง (ones' complement) ของจำนวนลบศูนย์คือ 11111111 ส่วนในระบบการแทนจำนวนมีจุดทศนิยมตามมาตรฐาน IEEE 754 จำนวนลบศูนย์เขียนแทนด้วย เลขชี้กำลังและแมนทิสซาที่เท่ากับศูนย์ทั้งคู่ และบิตกำกับเครื่องหมายเป็นหนึ่ง (หมายถึงค่าลบ)

ข้อกำหนดการเข้ารหัสเลขคณิตฐานสิบทั่วไป (General Decimal Arithmetic) ของไอบีเอ็ม กำหนดให้จำนวนลบศูนย์สามารถแทนได้ด้วย เลขชี้กำลังที่เป็นค่าใดๆ ก็ได้ในช่วงที่อนุญาต (ต่างกับ IEEE 754 ที่ต้องเป็นศูนย์) สัมประสิทธิ์ (แมนทิสซา) จะต้องเป็นศูนย์ทั้งหมด และบิตกำกับเครื่องหมายจะต้องเป็นหนึ่ง

จำนวนลบศูนย์ไม่สามารถแยกแยะออกจากจำนวนบวกศูนย์ด้วยการดำเนินการส่วนเติมเต็มสอง (two's complement) ซึ่งเป็นการกลับเครื่องหมายของจำนวนมีเครื่องหมายทั่วไป หรือกล่าวอีกนัยหนึ่งคือ ลบศูนย์ไม่มีส่วนเติมเต็มสอง

คุณสมบัติและการจัดการ

ในภาษาโปรแกรมอย่างเช่น ภาษาซี ภาษาซีชาร์ป ภาษาซีพลัสพลัส และภาษาจาวา มีความเป็นไปได้ที่จะดึงค่าลบศูนย์ออกมาเป็นผลลัพธ์ของนิพจน์ (เช่นจากผลลัพธ์ของภาวะน้อยเกินเก็บ (underflow) ทางเลขคณิต) ตามปกติแล้วจำนวนลบศูนย์และบวกศูนย์เมื่อเปรียบเทียบตามค่าจะให้ผลเท่ากัน ดังนั้นการเปรียบเทียบแบบธรรมดาไม่เพียงพอที่จะทดสอบว่าเป็นลบศูนย์หรือไม่

แนวทางในการทดสอบมีดังนี้

  • ใช้ฟังก์ชัน copysign () ที่กำหนดโดย IEEE 754 เพื่อคัดลอกเครื่องหมายของศูนย์ ไปยังจำนวนอื่นที่ไม่เป็นศูนย์
  • นำจำนวนบวกตัวหนึ่งมาหารด้วยจำนวนศูนย์ ซึ่งจะให้ผลลัพธ์เป็นค่าอนันต์ที่มีเครื่องหมายเดิมกำกับ (ระบบการแทนจำนวนมีจุดทศนิยม สามารถเก็บค่าอนันต์ที่มีเครื่องหมายได้) กล่าวคือ
    • (สำหรับจำนวนบวก x)
    • (สำหรับจำนวนบวก x)
  • ใช้ฟังก์ชันนี้เพื่อตรวจสอบค่าลบศูนย์ในจาวาสคริปต์
function isNegativeZero (x) { return x === 0 && 1/x < 0; }
isNegativeZero (-0.0) ; // ผลลัพธ์: จริง
isNegativeZero ( 0.0) ; // ผลลัพธ์: เท็จ
  • ในภาษาจาวา ให้ใช้เมทอด equals ในคลาส Double ซึ่งลบศูนย์จะมีความหมายต่างจากบวกศูนย์ ดังตัวอย่าง
Double negativeZero = new Double (-0.0) ;
negativeZero.equals (-0.0) ; // ผลลัพธ์: จริง
negativeZero.equals ( 0.0) ; // ผลลัพธ์: เท็จ
  • ในภาษาซี ให้ใช้เทคนิคที่ขึ้นอยู่กับการแทนค่าในฮาร์ดแวร์ของคอมพิวเตอร์เครื่องนั้น ตัวอย่างเช่น
* (int *) &var == 0x80000000

ด้านล่างนี้คือการดำเนินการอื่นๆ ที่เกี่ยวข้องกับลบศูนย์

  • (สำหรับจำนวนบวก x)

  • (สำหรับจำนวนลบ x)

  • (สำหรับจำนวนลบ x)





















การใช้งานทางวิทยาศาสตร์

−0 สามารถใช้แทนอุณหภูมิต่ำกว่าศูนย์ในอุตุนิยมวิทยา โดยเฉพาะในสเกลเซลเซียส −0 มักเป็นสิ่งสำคัญด้วยเหตุผลทางสถิติ เมื่อมีค่าไม่ต่ำพอที่จะปัดเศษให้เป็น −1 เช่นอุณหภูมิที่ −0.2 องศาเซลเซียส และค่านี้ไม่สามารถรายงานผลให้เป็น 0 องศาเซลเซียส เนื่องจากค่า 0 องศาจะไม่ถือว่าต่ำกว่าศูนย์ สำหรับการเก็บสถิติวันที่มีอุณหภูมิต่ำกว่าศูนย์องศา ซึ่งเป็นข้อมูลสถิติพื้นฐานของการเปรียบเทียบความหนาวเย็นในฤดูหนาว ดังนั้นจึงไม่สามารถละเลยไปได้

ในเรื่องของกลศาสตร์เชิงสถิติ ระบบเฉพาะที่อยู่ในสถานะของการผกผันประชากร (population inversion) อาจถูกพิจารณาว่ามีอุณหภูมิสัมบูรณ์ (absolute temperature) เท่ากับ −0 ซึ่งเป็นค่าสูงสุดเท่าที่เป็นไปได้

อ้างอิง

  • "Floating point types". MSDN C# Language Specification. สืบค้นเมื่อ October 15. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help)
  • "Division operator". MSDN C# Language Specification. สืบค้นเมื่อ October 15. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help)
  • Thomas Wang (March 2000). "Java Floating-Point Number Intricacies". September 2000. {{cite journal}}: Cite journal ต้องการ |journal= (help)
  • "Specification". General Decimal Arithmetic: Encoding Strawman 4d, version 0.96. สืบค้นเมื่อ October 16. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help) — a decimal floating point specification that includes negative zero
  • Kittel, Charles (1980). Thermal Physics. W. H. Freeman & Company. ISBN 0716710889. {{cite book}}: ไม่รู้จักพารามิเตอร์ |coauthors= ถูกละเว้น แนะนำ (|author=) (help)

แหล่งข้อมูลอื่น

  • Michael Ingrassia. "Fortran 95 SIGN Change". Sun Developer Network. สืบค้นเมื่อ October 15. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help) — the changes in the Fortran SIGN function in Fortran 95 to accommodate negative zero
  • "JScript data types". MSDN JScript. สืบค้นเมื่อ October 16. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help) — JScript's floating point type has negative zero by definition
  • "A look at the floating-point support of the Java virtual machine". Javaworld. สืบค้นเมื่อ October 16. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help) — representation of negative zero in the Java virtual machine
  • Bruce Dawson. "Comparing floating point numbers". {{cite journal}}: Cite journal ต้องการ |journal= (help) — how to handle negative zero when comparing floating-point numbers
  • John Walker. "Minus Zero". UNIVAC Memories. สืบค้นเมื่อ October 17. {{cite web}}: ตรวจสอบค่าวันที่ใน: |accessdate= (help); ไม่รู้จักพารามิเตอร์ |accessyear= ถูกละเว้น แนะนำ (|access-date=) (help) — One's complement numbers on the UNIVAC® 1100 family computers.