ما هي قيم النان الأخرى؟
-
23-09-2019 - |
سؤال
ال وثائق ل java.lang.Double.NaN
يقول أنه كذلك
ثابت يحمل قيمة غير (نان) من النوع
double
. وهو ما يعادل القيمة التي تم إرجاعها بواسطةDouble.longBitsToDouble(0x7ff8000000000000L)
.
هذا يبدو أنه يعني وجود آخرون. إذا كان الأمر كذلك ، كيف يمكنني الحصول عليها ، وهل يمكن القيام بذلك بشكل مقلوب؟
أن أكون واضحا ، أود أن أجد double
القيم x
مثل ذلك
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
و
Double.isNaN(x)
كلاهما صحيح.
المحلول
انت تحتاج doubleToRawLongBits
عوضا عن doubleToLongBits
.
doubleToRawLongBits
يستخلص التمثيل الثنائي الفعلي. doubleToLongBits
لا ، إنه يحول كل شيء NaN
s إلى الافتراضي NaN
أول.
double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.printf("%X\n", Double.doubleToLongBits(n));
System.out.printf("%X\n", Double.doubleToRawLongBits(n));
System.out.printf("%X\n", Double.doubleToLongBits(n2));
System.out.printf("%X\n", Double.doubleToRawLongBits(n2));
انتاج:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
نصائح أخرى
يستخدم جافا IEEE 754 لأرقام نقاطها العائمة وبالتالي تتبع قواعدها.
بحسب ال صفحة ويكيبيديا على نان يتم تعريفه على هذا النحو:
مثال حكيماً على دقة واحدة من IEEE.
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
أينx
يعني لا تهتم.
لذلك هناك عدد غير قليل من النباتات التي جميعها NaN
القيم.
يعرّف IEEE 754 NAN كرقم مع جميع البتات الأساسية التي هي 1
ورقم غير صفر في مانتيسا.
لذلك بالنسبة لرقم أحادي الدقة تبحث عنه:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java يتعامل مع هذا مثل ذلك:
Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.println(n.isNaN()); // true
System.out.println(n2.isNaN()); // true
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true
لتجمل ، يمكنك استخدام أي نان تريده والذي يتوافق مع القواعد المذكورة أعلاه (جميع البتات 1 في Mantissa! = 0).