سؤال

سامحني إذا كانت هذه مشكلة في المبتدئين ، لكنني حقًا لا أحصل عليها.

لديّ متغير عضو أعلنه هكذا:

public Double Value;

عندما أقوم بتعيين 3.14159265 للتقييم وحاول حساب جيبه ، يحدث هذا:

system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN

في الواقع ، يحدث هذا مع كل قيمة جربتها - حتى مع 0! يبدو أن Math.sin () تنتج دائمًا نان نتيجة لذلك ، بغض النظر عن قيمة الوسائط.

تقول المستندات:

إذا كانت الحجة نان أو ما لا نهاية ، فإن النتيجة هي نان.

لكن من الواضح أن حجتي ليست نان أو ما لا نهاية!

ما الذي يحدث هناك؟

تحديث

تبين أنني أغبى مبرمج على الأرض. في مشروعي ، يكون الرمز بأكمله أكثر تعقيدًا من المثال أعلاه. إنه نوع من محلل التعبير والمقيِّم وللوظائف الرياضية المحددة ، أستخدم بن التبديل لتحديد الوظيفة التي يجب الاتصال بها - لقد نسيت بيان الاستراحة في الحالات مما تسبب في تنفيذ وظيفة SQRT بمعلمة سلبية.

كما قلت - أغبى مبرمج على الأرض ...

لقد قبلت الجواب الأعلى لأنها أفضل IMHO. آسف يا رفاق لإضاعة وقتك ---

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

المحلول

Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN

المخرجات (كما هو متوقع):

3.14159265
3.5897930298416118E-9

لذلك يجب أن تكون المشكلة في مكان آخر ، أي إصدار من JDK تستخدمه؟ هل هو 32 بت أو 64 بت؟ هل هناك رمز آخر في الوسط لم تلصقه؟

الطريقة الوحيدة للحصول على ملف NaN من عند Math.sin باستخدام inf س NaN كمعلمة. وبدون تعيين هذه القيمة بشكل صريح إلى رقم يمكنك الحصول عليه فقط عن طريق إجراء حسابات خاطئة ، على سبيل المثال:

Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));

هذا سوف يخرج: NaN مرتين.

ملاحظتان:

  • لا تستخدم الحروف الكبيرة للمتغيرات (استخدم value, ، ليس Value)
  • عندما تحتاج إلى لسعات كمعلمات (أو تتألف إلى سلاسل أخرى) ، فلن تحتاج إلى الاتصال صراحة toString(), ، يمكنك ان تفعل System.out.println(value)

نصائح أخرى

هذا ما أحصل عليه:

Double Value;
Value = 3.14159265 ;
System.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
System.out.println(Value.toString()); //outputs 3.5897930298416118E-9

لذلك هناك خياران:

  1. الرمز الذي نشرته ليس الرمز الذي تستخدمه (لاحظت أن لديك حالة أدنى على النظام ، لذلك لن يتم تجميع هذا)
  2. شيء آخر هو تغيير قيمة القيمة إلى NAN قبل أو بعد القيام بالرياضيات

للمبتدئين ، أنت تستخدم Double مرجع (غلاف) النوع ، وليس double النوع البدائي - لماذا؟ ما هو الكود الذي تستخدمه بالفعل لتهيئة Value (أيهما ، لا ينبغي أن تبدأ بحرف كبير على أساس معايير ترميز Java المشتركة)؟ أظن أنك لا تتم تهيئة Value بصورة صحيحة. حاول البدء باستخدام أ double (وليس Double).

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