เอ็นจิน JS อนุญาตให้เปลี่ยนบิตของ NaN หรือไม่


12

ใน JavaScript ค่า NaN สามารถแสดงได้ด้วยช่วงกว้างของ 64- บิตคู่ภายใน โดยเฉพาะคู่ใด ๆ ที่มีการแสดง bitwise ต่อไปนี้

x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

ถูกตีความว่าเป็น NaN คำถามของฉันคือ: สมมติว่าฉันส่ง uints 32 บิตสองตัวไปยังหมายเลข JS โดยใช้ ArrayBuffers ส่งผ่านไปมาแล้วโยนกลับไปที่ uints 32 บิตสองตัว บิตที่กู้คืนจะเหมือนเดิมหรือเป็นเอ็นจิน JS ที่อนุญาตให้เปลี่ยนบิตของ NaN ตามใจชอบหรือไม่ กล่าวอีกนัยหนึ่งสามารถใช้หมายเลข JS เพื่อเก็บ 64- บิต losslesly?


2
ความคิดที่น่าสนใจ
ปลิ้น

1
การทดสอบที่ฉันทำ ดูเหมือนอย่างน้อย Node.js เปลี่ยนบิตที่จะทำให้สูญเสียข้อมูล
MaiaVictor

1
นอกเหนือจาก: ไม่ใช่ทุกรูปแบบบิตดังกล่าวหมายถึง NaN ถ้าทั้งหมด x buts หลังจากอันแรกเป็นศูนย์จะแสดงถึงอินฟินิตี้
Eric Postpischil

คำตอบ:


6

ECMA-262 9 THฉบับมิถุนายน 2018 (มาตรฐานที่ JavaScript มีจุดมุ่งหมายเพื่อให้สอดคล้อง) กล่าวว่าใน 6.1.6“จำนวนพิมพ์”:

…ค่า 9007199254740990 (นั่นคือ 2 53 -2) ค่า“ Not-a-Number” ที่แตกต่างกันของมาตรฐาน IEEE แสดงเป็น ECMAScript ในรูปของค่า NaN พิเศษ…ในการใช้งานบางอย่างรหัสภายนอกอาจตรวจจับความแตกต่างได้ ระหว่างค่า Not-a-Number ต่างๆ แต่พฤติกรรมดังกล่าวขึ้นอยู่กับการนำไปใช้งาน ถึงรหัส ECMAScript ค่า NaN ทั้งหมดแยกไม่ออกจากกัน

24.1.17“ NumberToRawBytes (ชนิด, ค่า, isLittleEndian)” กล่าวว่า:

…หากค่าเป็น NaN rawBytes อาจถูกตั้งค่าเป็นการนำไปใช้งานใด ๆ ที่เลือกรูปแบบ IEEE 754-2008 รูปแบบไบนารี 64 การเข้ารหัส Not-a-Number การนำไปใช้จะต้องเลือกการเข้ารหัสเดียวกันสำหรับค่าการนำไปใช้งานแต่ละค่าที่แตกต่าง ...

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


1

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

การใช้บิตอื่น ๆ ตราบใดที่มีการตั้งค่าบิต NaN ที่เงียบสงบน่าจะปลอดภัย แต่ดูเหมือนว่ายังมีที่ว่างสำหรับการติดตั้งใช้งานที่นี่และดังนั้นจึงไม่มีการรับประกัน

ปัญหาประเภทนี้คือสาเหตุที่การดำเนินงานภาษาปกติหลีกเลี่ยงการทำสิ่งใดก็ตามที่ขึ้นอยู่กับค่าภายในของ NaN และต้องการที่จะปฏิบัติต่อ NaN ทั้งหมดว่า "just NaN"


0

มาตรฐาน IEEE-754 ดั้งเดิมโดยเจตนาปล่อยบิตของ NaN ให้เป็นการนำไปใช้ มันให้คำแนะนำเช่น

คุณอาจใส่ที่อยู่หน่วยความจำดั้งเดิมของตำแหน่งที่สร้าง NaN

ในขณะเดียวกันเลขคณิตมีกฎเฉพาะเกี่ยวกับ NaN และไม่มีส่วนเกี่ยวข้องกับบิตที่ด้านล่าง ฉันไม่คิดว่ามันจะบอกว่าต้องทำอย่างไรเมื่อเพิ่ม NaN สองอัน - เก็บบิตจากหนึ่งในนั้นเทียบกับสร้างอีกบิตหนึ่ง เพียงแค่ว่าผลจะต้องยังคงเป็นน่าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.