Javas Math.sin () تنتج NAN طوال الوقت
سؤال
سامحني إذا كانت هذه مشكلة في المبتدئين ، لكنني حقًا لا أحصل عليها.
لديّ متغير عضو أعلنه هكذا:
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
لذلك هناك خياران:
- الرمز الذي نشرته ليس الرمز الذي تستخدمه (لاحظت أن لديك حالة أدنى على النظام ، لذلك لن يتم تجميع هذا)
- شيء آخر هو تغيير قيمة القيمة إلى NAN قبل أو بعد القيام بالرياضيات
للمبتدئين ، أنت تستخدم Double
مرجع (غلاف) النوع ، وليس double
النوع البدائي - لماذا؟ ما هو الكود الذي تستخدمه بالفعل لتهيئة Value
(أيهما ، لا ينبغي أن تبدأ بحرف كبير على أساس معايير ترميز Java المشتركة)؟ أظن أنك لا تتم تهيئة Value
بصورة صحيحة. حاول البدء باستخدام أ double
(وليس Double
).