เหตุผลสำหรับการเปรียบเทียบทั้งหมดที่คืนค่าเท็จสำหรับค่า IEEE754 NaN คืออะไร


267

ทำไมการเปรียบเทียบค่า NaN จึงแตกต่างจากค่าอื่น ๆ ทั้งหมด นั่นคือการเปรียบเทียบทั้งหมดกับโอเปอเรเตอร์ ==, <=,> =, <,> โดยที่หนึ่งหรือทั้งสองค่าเป็น NaN จะส่งคืนค่าเท็จซึ่งตรงกันข้ามกับพฤติกรรมของค่าอื่น ๆ ทั้งหมด

ฉันคิดว่าสิ่งนี้จะทำให้การคำนวณเชิงตัวเลขง่ายขึ้น แต่ฉันไม่สามารถหาเหตุผลที่ระบุไว้อย่างชัดเจนไม่ได้แม้แต่ในบันทึกการบรรยายเกี่ยวกับสถานะของ IEEE 754โดย Kahan ซึ่งกล่าวถึงการตัดสินใจออกแบบรายละเอียดอื่น ๆ

พฤติกรรมเบี่ยงเบนนี้ทำให้เกิดปัญหาเมื่อทำการประมวลผลข้อมูลอย่างง่าย ตัวอย่างเช่นเมื่อเรียงลำดับรายการเรคคอร์ด wrt บางฟิลด์มูลค่าจริงในโปรแกรม C ฉันจำเป็นต้องเขียนรหัสพิเศษเพื่อจัดการ NaN เป็นองค์ประกอบสูงสุดมิฉะนั้นอัลกอริทึมการเรียงลำดับอาจกลายเป็นสับสน

แก้ไข: คำตอบจนถึงทุกคนยืนยันว่ามันไม่มีความหมายในการเปรียบเทียบ NaNs

ฉันเห็นด้วย แต่นั่นไม่ได้หมายความว่าคำตอบที่ถูกต้องเป็นเท็จ แต่จะเป็น Not-a-Boolean (NaB) ซึ่งโชคดีที่ไม่มีอยู่จริง

ดังนั้นทางเลือกของการคืนค่าจริงหรือเท็จสำหรับการเปรียบเทียบอยู่ในมุมมองของฉันโดยพลการและสำหรับการประมวลผลข้อมูลทั่วไปมันจะมีประโยชน์ถ้ามันเป็นไปตามกฎหมายปกติ (reflexivity ของ ==, trichotomy ของ <, ==,>) ซึ่งพึ่งพากฎหมายเหล่านี้จะสับสน

ดังนั้นฉันขอความได้เปรียบที่เป็นรูปธรรมของการละเมิดกฎหมายเหล่านี้ไม่ใช่เพียงการให้เหตุผลเชิงปรัชญา

แก้ไข 2: ฉันคิดว่าฉันเข้าใจแล้วตอนนี้ว่าทำไมการทำให้ NaN maximal เป็นความคิดที่ไม่ดีมันจะทำให้การคำนวณขีด จำกัด สูงขึ้น

NaN! = NaN อาจเป็นที่ต้องการเพื่อหลีกเลี่ยงการตรวจจับคอนเวอร์เจนซ์ในลูปเช่น

while (x != oldX) {
    oldX = x;
    x = better_approximation(x);
}

ซึ่งควรเขียนได้ดีกว่าโดยเปรียบเทียบความแตกต่างสัมบูรณ์กับขีด จำกัด เล็กน้อย ดังนั้น IMHO นี่เป็นข้อโต้แย้งที่ค่อนข้างอ่อนแอในการทำลายการสะท้อนกลับที่ NaN


2
เมื่อ NaN เข้าสู่การคำนวณโดยทั่วไปแล้วจะไม่มีวันออกดังนั้นการทดสอบการลู่เข้าของคุณจะกลายเป็นวงไม่สิ้นสุด โดยปกติแล้วจะดีกว่าหากรายงานความล้มเหลวในการรวมเข้ากับรูทีนการโทร ดังนั้นโครงสร้างลูปมักจะกลายเป็นสิ่งที่ต้องการwhile (fabs(x - oldX) > threshold)ออกจากลูปหากการบรรจบเกิดขึ้นหรือ NaN เข้าสู่การคำนวณ การตรวจหา NaN และวิธีการรักษาที่เหมาะสมนั้นจะเกิดขึ้นนอกวง
สตีเฟ่น Canon

1
ถ้า NaN เป็นองค์ประกอบที่น้อยที่สุดของลำดับที่ขณะที่ลูปยังคงใช้งานได้
starblue

2
อาหารสำหรับความคิด: grouper.ieee.org/groups/1788/email/pdfmPSi1DgZZf.pdfหน้า 10
starblue

คำตอบ:


535

ฉันเป็นสมาชิกของคณะกรรมการ IEEE-754 ฉันจะพยายามช่วยอธิบายให้ชัดเจน

ก่อนอื่นตัวเลขทศนิยมไม่ได้เป็นตัวเลขจริงและเลขทศนิยมนั้นไม่ตรงกับความจริงของเลขคณิตจริง Trichotomy ไม่ได้เป็นคุณสมบัติเฉพาะของเลขคณิตจริงที่ไม่ได้ถือไว้เพื่อการลอยตัวหรือแม้แต่สิ่งที่สำคัญที่สุด ตัวอย่างเช่น:

  • นอกจากนี้ไม่ได้เชื่อมโยง
  • กฎหมายการกระจายสินค้าไม่ได้ถือ
  • มีจำนวนจุดลอยตัวโดยไม่ต้องผกผัน

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

  1. เมื่อเราทำได้เราจะจับคู่พฤติกรรมของเลขคณิตจริง
  2. เมื่อเราทำไม่ได้เราจะพยายามทำการละเมิดให้สามารถคาดการณ์ได้และง่ายต่อการวินิจฉัยมากที่สุด

เกี่ยวกับความคิดเห็นของคุณ "ซึ่งไม่ได้หมายความว่าคำตอบที่ถูกต้องเป็นเท็จ" นี่เป็นสิ่งที่ผิด เพรดิเคต(y < x)ถามว่าyน้อยกว่าxหรือไม่ ถ้าyเป็น NaN แสดงว่าไม่น้อยกว่าค่าเลขทศนิยมใด ๆxดังนั้นคำตอบจึงเป็นเท็จ

ฉันพูดถึงว่า trichotomy ไม่ถือค่าทศนิยม อย่างไรก็ตามมีคุณสมบัติที่คล้ายกันที่จะถือเป็น ข้อ 5.11 วรรค 2 ของมาตรฐาน 754-2008:

ความสัมพันธ์แบบเอกสิทธิ์เฉพาะบุคคลทั้งสี่มีความเป็นไปได้: น้อยกว่า, เท่ากัน, มากกว่า, และไม่ได้เรียงลำดับ กรณีสุดท้ายเกิดขึ้นเมื่อตัวถูกดำเนินการอย่างน้อยหนึ่งตัวคือ NaN NaN ทุกคนจะเปรียบเทียบกับทุกสิ่งที่ไม่เรียงลำดับรวมถึงตัวมันเอง

เท่าที่การเขียนโค้ดพิเศษเพื่อจัดการกับ NaNs นั้นเป็นไปได้โดยทั่วไป (แม้ว่าจะไม่ใช่เรื่องง่ายเสมอไป) ในการจัดโครงสร้างโค้ดของคุณในแบบที่ NaN ล้มลงอย่างถูกต้อง แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป เมื่อไม่มีรหัสพิเศษบางอย่างอาจจำเป็น แต่เป็นราคาเล็ก ๆ ที่จ่ายเพื่อความสะดวกในการปิดพีชคณิตที่นำไปสู่การคำนวณเลขทศนิยม


ภาคผนวก: ผู้แสดงความคิดเห็นหลายคนแย้งว่ามันจะมีประโยชน์มากขึ้นในการรักษาความสะท้อนของความเสมอภาคและ trichotomy บนพื้นที่ที่ใช้ NaN! = NaN ดูเหมือนจะไม่รักษาความจริงที่คุ้นเคย ฉันยอมรับว่ามีความเห็นอกเห็นใจต่อมุมมองนี้ดังนั้นฉันคิดว่าฉันจะทบทวนคำตอบนี้อีกครั้งและให้บริบทเพิ่มเติมอีกเล็กน้อย

ความเข้าใจของฉันจากการพูดคุยกับ Kahan คือ NaN! = NaN มีต้นกำเนิดมาจากการพิจารณาเชิงปฏิบัติสองประการ:

  • ที่x == yควรจะเทียบเท่าx - y == 0เมื่อใดก็ตามที่เป็นไปได้ (นอกเหนือจากทฤษฎีบทของเลขคณิตจริงแล้วสิ่งนี้ทำให้การใช้งานฮาร์ดแวร์เปรียบเทียบพื้นที่ที่มีประสิทธิภาพมากขึ้นซึ่งมีความสำคัญสูงสุดในเวลาที่มาตรฐานได้รับการพัฒนา - หมายเหตุอย่างไรก็ตามนี่เป็นการละเมิด x y = = อินฟินิตี้, ดังนั้นมันจึงไม่ได้เป็นเหตุผลที่ดีในตัวของมันเองก็จะได้รับพอสมควรงอไป(x - y == 0) or (x and y are both NaN))

  • ที่สำคัญกว่านั้นไม่มีisnan( )คำกริยาในช่วงเวลาที่ NaN ถูกทำให้เป็นทางการในคณิตศาสตร์ 8087; มันจำเป็นที่จะต้องให้โปรแกรมเมอร์ด้วยวิธีการที่สะดวกและมีประสิทธิภาพในการตรวจสอบค่า NaN ที่ไม่ได้ขึ้นอยู่กับภาษาการเขียนโปรแกรมที่ให้สิ่งisnan( )ที่อาจใช้เวลาหลายปี ฉันจะอ้างอิงการเขียนของตัวเอง Kahan ในเรื่อง:

หากไม่มีวิธีที่จะกำจัด NaNs พวกเขาจะไร้ประโยชน์เหมือนคน Indefinites บน CRAYs ทันทีที่มีใครพบการคำนวณจะดีที่สุดแทนที่จะหยุดต่อไปเป็นเวลาไม่สิ้นสุดเพื่อหาข้อสรุปที่ไม่มีกำหนด นั่นคือเหตุผลที่การดำเนินการบางอย่างกับ NaN ต้องส่งผลลัพธ์ที่ไม่ใช่ของ NaN การดำเนินการใด …ข้อยกเว้นคือ C predicates“ x == x” และ“ x! = x”, ซึ่งเป็นลำดับที่ 1 และ 0 สำหรับทุกอนันต์หรือจำนวน จำกัด x แต่กลับกันถ้า x ไม่ใช่ตัวเลข (NaN); สิ่งเหล่านี้ให้ความแตกต่างอย่างง่าย ๆ เพียงอย่างเดียวระหว่าง NaN กับตัวเลขในภาษาที่ไม่มีคำว่า NaN และภาคแสดง IsNaN (x)

โปรดทราบว่านี่เป็นตรรกะที่ออกกฎการส่งคืนบางสิ่งเช่น "Not-A-Boolean" บางทีลัทธินิยมนิยมนี้ถูกใส่ผิดที่และมาตรฐานควรจำเป็นisnan( )แต่นั่นทำให้ NaN แทบจะเป็นไปไม่ได้ที่จะใช้งานได้อย่างมีประสิทธิภาพและสะดวกสบายเป็นเวลาหลายปีในขณะที่โลกรอการยอมรับภาษาโปรแกรม ฉันไม่มั่นใจว่าจะเป็นการแลกเปลี่ยนที่สมเหตุสมผล

เป็นทื่อ: ผลลัพธ์ของ NaN == NaN จะไม่เปลี่ยนแปลงในขณะนี้ ดีกว่าที่จะเรียนรู้ที่จะอยู่กับมันมากกว่าที่จะบ่นบนอินเทอร์เน็ต หากคุณต้องการยืนยันว่าควรมีความสัมพันธ์กับคำสั่งซื้อที่เหมาะสมกับคอนเทนเนอร์ด้วยฉันขอแนะนำให้สนับสนุนให้ภาษาโปรแกรมที่คุณโปรดปรานใช้ภาคtotalOrderแสดงที่ได้มาตรฐานใน IEEE-754 (2008) ความจริงที่ว่ามันยังไม่ได้พูดถึงความถูกต้องของความกังวลของ Kahan ที่กระตุ้นให้เกิดสถานะของกิจการในปัจจุบัน


16
ฉันอ่านคะแนนของคุณ 1 และ 2 จากนั้นฉันสังเกตเห็นว่าในทางคณิตศาสตร์จริง (ขยายเพื่อให้ NaN ในสถานที่แรก) NaN เท่ากับตัวเอง - เพียงเพราะในทางคณิตศาสตร์นิติบุคคลใด ๆ จะเท่ากับตัวเองโดยไม่มีข้อยกเว้น ตอนนี้ฉันสับสน: ทำไม IEEE ถึงไม่ "ตรงกับพฤติกรรมของเลขคณิตจริง" ซึ่งจะทำให้ NaN == NaN? ฉันพลาดอะไรไป
สูงสุด

12
ตกลงกัน; nonreflexivity ของ NaNs ไม่ได้สร้างจุดจบของความเจ็บปวดสำหรับภาษาเช่น Python ด้วยความหมายของการบรรจุตามความเสมอภาค คุณจริงๆไม่ต้องการความเท่าเทียมกันที่จะล้มเหลวที่จะเป็นความสมดุลเมื่อคุณกำลังพยายามที่จะสร้างภาชนะที่ด้านบนของมัน และการมีสองแนวคิดแยกกันของความเท่าเทียมกันนั้นก็ไม่ใช่ตัวเลือกที่เป็นมิตรเช่นกันสำหรับภาษาที่ควรเรียนรู้ได้ง่าย ผลลัพธ์ (ในกรณีของ Python) เป็นการประนีประนอมที่ไม่เปราะบางระหว่างการเคารพ IEEE 754 และซีแมนทิกส์บรรจุที่ไม่หัก โชคดีที่มันยากที่จะนำ NaN เข้าสู่ภาชนะบรรจุ
Mark Dickinson

5
ข้อสังเกตที่ดีบางอย่างที่นี่: bertrandmeyer.com/2010/02/06/…
Mark Dickinson

6
@StephenCanon: (0/0) == (+ INF) + (-INF) ในทางใดจะไร้สาระมากกว่าที่มี1f/3f == 10000001f/30000002f? หากค่าจุดลอยตัวถูกพิจารณาว่าเป็นคลาสที่เท่ากันก็a=bไม่ได้หมายความว่า "การคำนวณที่ให้ผลaและbหากทำด้วยความแม่นยำอย่างไม่มีที่สิ้นสุดจะให้ผลลัพธ์ที่เหมือนกัน" แต่แทนที่จะเป็น "สิ่งที่เป็นที่รู้จักเกี่ยวกับการaจับคู่b" ฉันอยากรู้ถ้าคุณรู้ตัวอย่างของรหัสที่มี "น่าน! = น่าน" ทำให้สิ่งต่าง ๆ ง่ายกว่าที่พวกเขาจะเป็นอย่างอื่น?
supercat

5
ในทางทฤษฎีถ้าคุณมีน่าน == น่านและไม่มี isNaN คุณอาจยังคงทดสอบน่าน!(x < 0 || x == 0 || x > 0)แต่ก็จะได้รับช้าลงและ clumsier x != xกว่า
user2357112 รองรับ Monica

50

NaN ถือได้ว่าเป็นรัฐ / หมายเลขที่ไม่ได้กำหนด คล้ายกับแนวคิดของ 0/0 ที่ไม่ได้กำหนดหรือ sqrt (-3) (ในระบบจำนวนจริงที่จุดลอยอยู่)

NaN ใช้เป็นตัวยึดตำแหน่งสำหรับสถานะที่ไม่ได้กำหนดนี้ การพูดทางคณิตศาสตร์ไม่ได้กำหนดไม่เท่ากับ undefined คุณไม่สามารถพูดได้ว่าค่าที่ไม่ได้กำหนดนั้นมากกว่าหรือน้อยกว่าค่าที่ไม่ได้กำหนดอื่น ดังนั้นการเปรียบเทียบทั้งหมดจึงคืนเท็จ

พฤติกรรมนี้เป็นประโยชน์ในกรณีที่คุณเปรียบเทียบ sqrt (-3) กับ sqrt (-2) พวกเขาทั้งสองจะกลับมาน่าน แต่พวกเขาจะไม่เทียบเท่าแม้ว่าพวกเขาจะกลับมาเหมือนกัน ดังนั้นการมีความเสมอภาคคืนเท็จเมื่อจัดการกับ NaN เป็นพฤติกรรมที่ต้องการ


5
ผลลัพธ์ของ sqrt (1.00000000000000022) == sqrt (1.0) คืออะไร แล้ว (1E308 + 1E308-1E308-1E308-1E308) == (1E308 + 1E308)? นอกจากนี้การเปรียบเทียบเพียงห้าจากหกรายการเท่านั้นที่กลับมาเป็นเท็จ !=ประกอบการผลตอบแทนจริง มีNaN==NaNและNaN!=NaNทั้งผลตอบแทนที่เป็นเท็จจะให้รหัสที่เปรียบเทียบ x และ y จะเลือกสิ่งที่ควรจะเกิดขึ้นเมื่อทั้งสองตัวถูกดำเนินการอยู่น่านโดยการเลือกอย่างใดอย่างหนึ่งหรือ== !=
supercat

38

ที่จะโยนในการเปรียบเทียบอีก ถ้าฉันส่งคุณสองกล่องและบอกคุณว่าไม่มีกล่องใดในแอปเปิ้ลคุณจะบอกฉันว่ากล่องนั้นมีสิ่งเดียวกันหรือไม่?

NaN ไม่มีข้อมูลเกี่ยวกับสิ่งที่เป็นสิ่งที่มันไม่ใช่ ดังนั้นองค์ประกอบเหล่านี้จึงไม่สามารถกล่าวได้ว่าเท่าเทียมกันอย่างแน่นอน


6
ชุดว่างทั้งหมดจะเท่ากันตามคำจำกัดความ
MSalters

28
กล่องที่คุณได้รับไม่เป็นที่รู้จักว่าว่างเปล่า
John Smith

7
คุณช่วยบอกฉันว่ากล่องไม่มีสิ่งเดียวกันได้หรือไม่? ฉันเข้าใจเหตุผล(NaN==Nan)==falseได้ (Nan!=Nan)==trueสิ่งที่ผมไม่เข้าใจคือเหตุผลสำหรับการ
supercat

3
ฉันถือว่า NaN! = NaN เป็นจริงเพราะ x! = y ถูกกำหนดเป็น! (x == y) จริงอยู่ที่ฉันไม่รู้ว่าข้อมูลจำเพาะ IEEE กำหนดไว้อย่างนั้นหรือไม่
Kef Schecter

6
แต่ในการเปรียบเทียบนี้ถ้าคุณให้กล่องฉันบอกว่ามันไม่มีแอปเปิ้ลแล้วถามฉันว่ามันเท่ากับตัวเองหรือไม่คุณคาดหวังให้ฉันปฏิเสธ เพราะนั่นคือสิ่งที่ฉันจะต้องพูดตาม IEEE
เซมิโคลอน

12

จากบทความวิกิพีเดียเกี่ยวกับNaNแนวทางปฏิบัติดังต่อไปนี้อาจทำให้เกิด NaNs:

  • การดำเนินการทางคณิตศาสตร์ทั้งหมด> ด้วย NaN อย่างน้อยหนึ่งตัวถูกดำเนินการ
  • ดิวิชั่น 0/0, ∞ / ∞, ∞ / -∞, -∞ / ∞, และ-∞ / -∞
  • การคูณ 0 ×∞และ 0 ×-∞
  • การบวก∞ + (-∞), (-∞) + ∞และการลบที่เทียบเท่า
  • การใช้ฟังก์ชั่นในการโต้แย้งนอกโดเมนรวมถึงการหาสแควร์รูทของจำนวนลบ, การลอการิทึมของจำนวนลบ, แทนเจนต์ของผลคูณของคี่ 90 องศา (หรือπ / 2 เรเดียน) หรือการไซน์ผกผัน หรือโคไซน์ของตัวเลขที่น้อยกว่า -1 หรือมากกว่า +1

เนื่องจากไม่มีวิธีที่จะรู้ว่าการดำเนินการใดของการสร้าง NaN จึงไม่มีวิธีเปรียบเทียบสิ่งที่สมเหตุสมผล


3
ยิ่งกว่านั้นแม้ว่าคุณจะรู้ว่าการดำเนินการใดมันไม่ได้ช่วยอะไรเลย ฉันสามารถสร้างสูตรจำนวนเท่าใดก็ได้ที่ไปที่ 0/0 ในบางจุดซึ่งมี (ถ้าเราถือว่าความต่อเนื่อง) ค่าที่กำหนดไว้อย่างดีและแตกต่างกัน ณ จุดนั้น
David Thornley

4

ฉันไม่ทราบเหตุผลการออกแบบ แต่นี่เป็นข้อความที่ตัดตอนมาจากมาตรฐาน IEEE 754-1985:

"มันจะเป็นไปได้ที่จะเปรียบเทียบจำนวนจุดลอยตัวในรูปแบบที่รองรับทั้งหมดแม้ว่ารูปแบบของตัวถูกดำเนินการแตกต่างกันการเปรียบเทียบนั้นแน่นอนและไม่มากจนเกินไปหรือไม่ไหลเกินความสัมพันธ์ที่เป็นเอกเทศทั้งสี่นั้นเป็นไปได้: น้อยกว่าเท่ากัน กรณีสุดท้ายเกิดขึ้นเมื่อมีอย่างน้อยหนึ่งตัวถูกดำเนินการเป็น NaN ทุก NaN จะเปรียบเทียบกับทุกอย่างที่ไม่มีการเรียงลำดับ


2

มันดูแปลก ๆ เพียงเพราะสภาพแวดล้อมการเขียนโปรแกรมส่วนใหญ่ที่อนุญาต NaNs ไม่อนุญาตให้ใช้ตรรกะ 3 ค่า หากคุณโยนตรรกะที่มีค่า 3 ลงในส่วนผสมนั้นจะสอดคล้องกัน:

  • (2.7 == 2.7) = จริง
  • (2.7 == 2.6) = false
  • (2.7 == NaN) = ไม่ทราบ
  • (NaN == NaN) = ไม่ทราบ

แม้แต่. NET ก็ไม่ได้มีbool? operator==(double v1, double v2)โอเปอเรเตอร์ดังนั้นคุณยังติดอยู่กับ(NaN == NaN) = falseผลลัพธ์ที่งี่เง่า


1

ฉันเดาว่า NaN (ไม่ใช่ตัวเลข) หมายความว่า: นี่ไม่ใช่ตัวเลขและการเปรียบเทียบมันไม่สมเหตุสมผล

มันค่อนข้างเหมือนกับเลขคณิตใน SQL ที่มีnullตัวถูกดำเนินการ: ผลลัพธ์ทั้งหมดnullนั้น

การเปรียบเทียบตัวเลขทศนิยมจะเปรียบเทียบค่าตัวเลข ดังนั้นจึงไม่สามารถใช้สำหรับค่าที่ไม่ใช่ตัวเลขได้ ดังนั้น NaN จึงไม่สามารถเปรียบเทียบในความหมายที่เป็นตัวเลข


3
"นี่ไม่ใช่ตัวเลขและการเปรียบเทียบมันไม่สมเหตุสมผล" สตริงไม่ได้เป็นตัวเลข แต่การเปรียบเทียบนั้นมีเหตุผล
jason

2
ใช่การเปรียบเทียบสตริงกับสตริงเหมาะสม แต่การเปรียบเทียบสตริงกับแอปเปิ้ลพูดไม่สมเหตุสมผลมากนัก เนื่องจากแอปเปิ้ลและลูกแพร์ไม่ใช่ตัวเลขมันสมเหตุสมผลไหมที่จะเปรียบเทียบมัน? อันไหนดีกว่ากัน?
Daren Thomas

@DarenThomas: ใน SQL ไม่ใช่ "IF NULL = NULL THOO แล้ว" และ "IF Null <> Null จากนั้นโทร FOO;" [หรืออะไรก็ตามไวยากรณ์คือ] FOOจะดำเนินการ เพื่อให้ NaN เทียบเท่าif (NaN != NaN) foo();ไม่ควรดำเนินการfooแต่ทำได้
supercat

1

คำตอบที่ง่ายเกินไปคือ NaN ไม่มีค่าตัวเลขดังนั้นจึงไม่มีอะไรที่จะเปรียบเทียบกับสิ่งอื่นได้

คุณอาจลองทดสอบและแทนที่ NaN ของคุณด้วย + INF หากคุณต้องการให้พวกเขาทำตัวเหมือน + INF


0

ในขณะที่ฉันเห็นด้วยว่าการเปรียบเทียบ NaN กับจำนวนจริงใด ๆ ควรไม่เรียงลำดับฉันคิดว่ามีเพียงการเปรียบเทียบ NaN กับตัวเอง ตัวอย่างเช่นวิธีหนึ่งจะค้นพบความแตกต่างระหว่างการส่งสัญญาณ NaNs และ NaN ที่เงียบสงบ? ถ้าเราคิดว่าสัญญาณเป็นชุดของค่าบูลีน (เช่นบิต - เวกเตอร์) เราอาจถามว่าบิตเวกเตอร์นั้นเหมือนกันหรือต่างกันและเรียงลำดับตามนั้น ยกตัวอย่างเช่นในการถอดรหัสเลขชี้กำลังอคติสูงสุดหากมีการเปลี่ยนซิกนิฟิแคนด์ไปเพื่อให้จัดบิตซิกนิฟิแคนด์ที่สำคัญที่สุดกับบิตที่สำคัญที่สุดของรูปแบบไบนารีค่าลบจะเป็น NaN ที่เงียบและค่าบวกใด ๆ จะ เป็นสัญญาณ NaN ไม่มีการสงวนศูนย์แน่นอนสำหรับอินฟินิตี้และการเปรียบเทียบจะไม่มีการเรียงลำดับ การจัดตำแหน่ง MSB จะช่วยให้การเปรียบเทียบโดยตรงของสัญญาณแม้จากรูปแบบไบนารีที่แตกต่างกัน NaN สองตัวที่มีสัญญาณชุดเดียวกันจึงมีความเท่าเทียมกันและให้ความหมายต่อความเท่าเทียมกัน


-1

สำหรับฉันวิธีที่ง่ายที่สุดในการอธิบายคือ:

ฉันมีบางอย่างและถ้าไม่ใช่แอปเปิ้ลแล้วมันเป็นสีส้มหรือไม่?

คุณไม่สามารถเปรียบเทียบ NaN กับสิ่งอื่น (แม้แต่ตัวเอง) เพราะมันไม่มีคุณค่า นอกจากนี้ยังสามารถเป็นค่าใด ๆ (ยกเว้นตัวเลข)

ฉันมีบางอย่างและถ้ามันไม่เท่ากับตัวเลขแล้วมันเป็นสตริงหรือไม่?


คุณหมายถึง "มันสามารถเป็นค่าใด ๆ ยกเว้นตัวเลข"?
pushkin

-2

เพราะคณิตศาสตร์เป็นสาขาที่มีตัวเลข "มีอยู่" ในการคำนวณคุณต้องเริ่มต้นตัวเลขเหล่านั้นและรักษาสถานะตามความต้องการของคุณ ในการเริ่มต้นใช้งานหน่วยความจำในสมัยก่อนนั้นทำงานในรูปแบบที่คุณไม่สามารถวางใจได้ คุณไม่สามารถอนุญาตให้ตัวเองที่จะคิดเกี่ยวกับเรื่องนี้"โอ้ที่จะเริ่มต้นได้ด้วย 0xCD ตลอดเวลา algo ของฉันจะไม่ยากจน"

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

นี่เป็นเพียงจาระบีที่คุณสามารถใส่ลงในตัวแปรใหม่ในการสร้างแทนที่จะเขียนโปรแกรมแบบสุ่มจากหน่วยความจำคอมพิวเตอร์ และอัลกอริธึมของคุณไม่ว่ามันจะเป็นอะไร

ถัดไปเมื่อคุณยังพบว่าอัลกอริทึมของคุณกำลังสร้าง NaN อยู่ทันใดคุณสามารถล้างมันได้โดยดูที่สาขาทุกสาขาในแต่ละครั้ง อีกครั้งกฎ "เสมอเท็จ" กำลังช่วยในเรื่องนี้


-4

คำตอบสั้น ๆ :

เพราะดังต่อไปนี้: nan / nan = 1 ต้องไม่ถือ มิฉะนั้นinf/infจะเป็น 1

(ดังนั้นจึงnanไม่สามารถเท่ากับnanสำหรับ>หรือ<หากnanจะเคารพความสัมพันธ์คำสั่งใด ๆ ในชุดพอใจทรัพย์สิน Archimedean เราจะได้อีกครั้งnan / nan = 1ที่ขีด จำกัด )


2
ไม่นั่นไม่สมเหตุสมผลเลย เรามีinf = infและinf / inf = nanดังนั้นnan = nanจะไม่ป้องกันnan / nan = nanอย่างใดอย่างหนึ่ง
starblue

@starblue คุณหมายถึงnan / nan = 1อะไร อย่างไรก็ตาม ... เหตุผลของคุณสมเหตุสมผลถ้า inf และ nan เป็นเหมือนตัวเลขอื่น ๆ มันไม่ใช่กรณี เหตุผลที่inf/infจะต้องเป็นnan(หรือไม่แน่นอนในรูปแบบคณิตศาสตร์) และไม่1ละเอียดกว่าการยศาสตร์เชิงพีชคณิตแบบง่าย ๆ (ดูทฤษฎีบท De L'Hospital)
SeF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.