سؤال

ال وثائق ل java.lang.Double.NaN يقول أنه كذلك

ثابت يحمل قيمة غير (نان) من النوع double. وهو ما يعادل القيمة التي تم إرجاعها بواسطة Double.longBitsToDouble(0x7ff8000000000000L).

هذا يبدو أنه يعني وجود آخرون. إذا كان الأمر كذلك ، كيف يمكنني الحصول عليها ، وهل يمكن القيام بذلك بشكل مقلوب؟

أن أكون واضحا ، أود أن أجد double القيم x مثل ذلك

Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)

و

Double.isNaN(x)

كلاهما صحيح.

هل كانت مفيدة؟

المحلول

انت تحتاج doubleToRawLongBits عوضا عن doubleToLongBits.

doubleToRawLongBits يستخلص التمثيل الثنائي الفعلي. doubleToLongBits لا ، إنه يحول كل شيء NaNs إلى الافتراضي 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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top