**ศูนย์มีเครื่องหมาย** หมายถึงจำนวน 0 (ศูนย์) ที่ถูกกำกับด้วยเครื่องหมายบวกหรือลบ ได้แก่ **−0** (ลบศูนย์) และ **+0** (บวกศูนย์) ในเลขคณิตธรรมดาทั่วไป −0 = +0 = 0 อย่างไรก็ตาม การแทนจำนวนบางระบบในคอมพิวเตอร์อนุญาตให้มีศูนย์สองชนิดนี้ได้ ซึ่งเกิดขึ้นใน *เครื่องหมายและขนาด* กับ *ส่วนเติมเต็มหนึ่ง* ของการแทนจำนวนมีเครื่องหมายสำหรับจำนวนเต็ม และในการแทนจำนวนจุดลอยตัวส่วนใหญ่ จำนวน 0 มักจะถูกเข้ารหัสเป็น +0 แต่ก็สามารถแทนด้วย −0 อย่างใดอย่างหนึ่งก็ได้

มาตรฐาน IEEE 754 สำหรับเลขคณิตของจำนวนจุดลอยตัว (ปัจจุบันมีใช้ในคอมพิวเตอร์และภาษาโปรแกรมส่วนใหญ่ที่รองรับจำนวนจุดลอยตัว) จำเป็นต้องมีทั้ง +0 และ −0 ศูนย์ทั้งสองชนิดสามารถพิจารณาว่าเป็นรูปแบบผันแปรอันหนึ่งของเส้นจำนวนจริงขยาย ตัวอย่างเช่น 1/−0 = −∞ และ 1/+0 = +∞ ซึ่งการหารด้วยศูนย์จะเป็นอนิยามเฉพาะ ±0/±0 กับ ±∞/±∞

ศูนย์ที่มีเครื่องหมายลบสะท้อนให้เห็นถึงมโนทัศน์ของคณิตวิเคราะห์เกี่ยวกับการมีค่าเข้าใกล้ 0 จากด้านที่มีค่าต่ำกว่าเป็นลิมิตด้านเดียว ซึ่งอาจเขียนได้เป็น x → 0−, x → 0− หรือ x → ↑0 สัญกรณ์ "−0" ก็ยังใช้สำหรับเขียนแทนจำนวนลบขนาดเล็กที่ถูกปัดเศษให้เป็นศูนย์อย่างไม่เป็นทางการ มโนทัศน์ของลบศูนย์ก็มีการประยุกต์ใช้เชิงทฤษฎีบางอย่างในกลศาสตร์เชิงสถิติและสาขาอื่น ๆ

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

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

การเข้ารหัสส่วนเติมเต็มสอง (two's complement) ที่ใช้กันอย่างกว้างขวางไม่อนุญาตให้มีค่าลบศูนย์ การแทนจำนวนมีเครื่องหมายแบบ 1+7 บิตสำหรับจำนวนเต็ม ลบศูนย์แทนด้วยค่า 1000 0000 และการแทนส่วนเติมเต็มหนึ่ง (one's complement) แบบ 8 บิต ลบศูนย์แทนด้วยค่า 1111 1111 การเข้ารหัสทั้งสามชนิดนั้น บวกศูนย์แทนด้วยค่า 0000 0000

ลบศูนย์ในการแทนจำนวนจุดลอยตัว IEEE 754 แบบ 32 บิต
ในจำนวนจุดลอยตัวฐานสองของ IEEE 754 ค่าศูนย์ทั้งสองแทนโดยกำหนดให้บิตเลขชี้กำลังและเลขนัยสำคัญเป็นศูนย์ทั้งหมด สำหรับลบศูนย์ก็กำหนดให้บิตเครื่องหมายเป็นหนึ่ง เราอาจได้ลบศูนย์เป็นผลลัพธ์จากการคำนวณเฉพาะอย่าง ตัวอย่างเช่นผลจากภาวะน้อยเกินเก็บเชิงเลขคณิต (arithmetic underflow) ของจำนวนลบ หรือ −1.0\*0.0 หรือเพียงแค่ −0.0

ในการเข้ารหัสจำนวนจุดลอยตัวฐานสิบของ IEEE 754 ลบศูนย์แทนโดยกำหนดให้เลขชี้กำลังเป็นค่าใดก็ได้ที่ใช้ได้ในพิสัยของการเข้ารหัส เลขนัยสำคัญกำหนดให้เป็นศูนย์ และบิตเครื่องหมายเป็นหนึ่ง

สมบัติและการจัดการ
------------------

มาตรฐาน IEEE 754 เกี่ยวกับจำนวนจุดลอยตัวได้ระบุพฤติกรรมของบวกศูนย์และลบศูนย์ไว้ภายใต้การดำเนินการหลายอย่าง ผลลัพธ์ที่ได้อาจขึ้นอยู่กับการตั้งค่าภาวะการปัดเศษแบบ IEEE

### เลขคณิต

การคูณและการหารปฏิบัติตามกฎการผสานเครื่องหมายอันเป็นปกติดังนี้

* {\displaystyle {\frac {-0}{\left|x\right|}}=-0\,\!} (สำหรับค่า *x* ที่ไม่ใช่ศูนย์)
* {\displaystyle (-0)\cdot (-0)=+0\,\!}
* {\displaystyle \left|x\right|\cdot (-0)=-0\,\!}

การบวกและการลบถูกจัดการโดยเฉพาะถ้าค่าต่าง ๆ อาจถูกตัดออกได้ ดังนี้

* {\displaystyle x+(\pm 0)=x\,\!}
* {\displaystyle (-0)+(-0)=(-0)-(+0)=-0\,\!}
* {\displaystyle (+0)+(+0)=(+0)-(-0)=+0\,\!}
* {\displaystyle x-x=x+(-x)=+0\,\!} (สำหรับจำนวนจำกัด *x* ใด ๆ; หรือเท่ากับ −0 กรณีปัดเศษเข้าสู่จำนวนลบ)

เนื่องจากมีค่าลบศูนย์อยู่ในระบบการแทนจำนวน ประโยค *z* = −(*x* − *y*) และ *z* = (−*x*) − (−*y*) จึงไม่สามารถลดทอนให้เป็น *z* = *y* − *x* ได้ เมื่อ *x*, *y*, *z* เป็นจำนวนจุดลอยตัว

กฎพิเศษอื่น ๆ มีดังนี้

* {\displaystyle {\sqrt {-0}}=-0\,\!}
* {\displaystyle {\frac {-0}{-\infty }}=+0\,\!} (ปฏิบัติตามกฎเครื่องหมายสำหรับการหาร)
* {\displaystyle {\frac {\left|x\right|}{-0}}=-\infty \,\!} (สำหรับค่า *x* ที่ไม่ใช่ศูนย์; ปฏิบัติตามกฎเครื่องหมายสำหรับการหาร)
* {\displaystyle {\pm 0}\times {\pm \infty }={\mbox{NaN}}\,\!} (ค่าไม่ใช่จำนวน (อังกฤษ: NaN (Not a Number)) หรือขัดจังหวะให้แก่รูปแบบยังไม่กำหนด)
* {\displaystyle {\frac {\pm 0}{\pm 0}}={\mbox{NaN}}\,\!}

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

### การเปรียบเทียบ

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

* การเล่นชนิดข้อมูล (type punning) โดยเปลี่ยนให้เป็นชนิดจำนวนเต็ม แล้วเปรียบเทียบรูปแบบบิต
* การใช้ฟังก์ชัน copysign() ของ IEEE 754 เพื่อคัดลอกเครื่องหมายของศูนย์ไปยังจำนวนอื่นที่ไม่ใช่ศูนย์
* การคำนวณส่วนกลับของศูนย์เพื่อให้ได้ 1/+0 = +∞ หรือ 1/−0 = −∞ อย่างใดอย่างหนึ่ง

การแปลงชนิดข้อมูล (type casting) เป็นชนิดจำนวนเต็มจะไม่ได้ผลเสมอไป โดยเฉพาะอย่างยิ่งบนระบบส่วนเติมเต็มสอง

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

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

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

อ้างอิง
-------

1. ↑  William Kahan, "Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing's Sign Bit", in *The State of the Art in Numerical Analysis* (eds. Iserles and Powell), Clarendon Press, Oxford, 1987.
2. ↑  William Kahan, Derivatives in the Complex z-plane, p10.
3. ↑  Cowlishaw, Mike (7 April 2009). "Decimal Arithmetic: Arithmetic operations - square-root". speleotrove.com (IBM Corporation). สืบค้นเมื่อ 7 December 2010.

* "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. คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2005-09-21. สืบค้นเมื่อ 2008-03-11. `{{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*. คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2012-02-17. สืบค้นเมื่อ 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.