كوس من الدرجات لا تتطابق مع cos من الراديان المكافئ

StackOverflow https://stackoverflow.com/questions/3745757

  •  04-10-2019
  •  | 
  •  

سؤال

جميع وظائف الرياضيات في جافا سكريبت تستخدم الراديان بدلاً من الدرجات. ومع ذلك ، فهي إما غير متكافئة ، أو أنا بعيدًا عن القاعدة.

التحويل من الدرجات إلى راديان هو:

var rad = angle * Math.PI / 180

زاوية 90 درجة يساوي 1.57079633 راديان

جيب التمام لزاوية 90 درجة يساوي 0.
جيب التمام من 1.57079633 راديان يساوي -3.20510345 × 10-9.

لاحظ أنه في JavaScript ، يتم كل شيء في خطوة واحدة لتجنب التقريب الأخطاء:

var cos = Math.cos(angle * Math.PI / 180);

من الواضح أنني أفتقد شيئًا واضحًا هنا ، لكن الصبي هو أنه يفسد الرمز.

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

المحلول

يتم كل شيء في خطوة واحدة لتجنب التقريب الأخطاء

كيف يتجنب هذا التقريب الأخطاء؟ هذا يعني فقط أن أخطاء التقريب غير متوفرة في متغير منفصل ، هذا كل شيء.

ال حقيقي لا يمكن تمثيل قيمة PI بدقة كرقم عائم ، وبالتالي فإن القيمة الحقيقية لـ PI / 2 لا يمكنها أيضًا. لذلك لا يمكنك إعطاء Math.cos القيمة الدقيقة اللازمة للحصول على 0. ولكن مهلا - 10-9 هو صغير جدا جدا رقم. هذا يعني أنه إذا كنت ترسم خطًا طوله 10000 كيلومتر ، فسوف ينتهي بك الأمر إلى الانحراف عن 1 سم بعيدًا عن المحور ذي الصلة.

هذا هو بالضبط نوع الشيء الذي يجب أن تتوقعه عند التعامل مع أرقام النقاط العائمة. لا تقارن بالمساواة - قارن في بعض التسامح.

نصائح أخرى

سيكون هناك دائما أخطاء تقريب. والنقطة العائمة ليست دقيقة رياضيا على أي حال ، إنها دقيقة فقط لكمية معينة من الأرقام المهمة.

قم بتغيير الكود الخاص بك بحيث لا "يفسد" عندما يكون لديك أخطاء بترتيب 1/1000000000.

بالنسبة لمعظمنا يقوم بمبالغ جادة على أجهزة الكمبيوتر 0 هو يساوي -3.20510345 × 10^-9 لأي درجة معقولة من الدقة التي لديك الحق في توقعها عند العمل مع أرقام النقطة العائمة. هذا موضوع مغطى بانتظام على ذلك.

نعم ، أنت فقط تفقد بيانات عن تحويلات النوع هنا.

90 DEGRESS في RADIANS لا يساوي بالضبط 1.57079633. إذا كان هناك المزيد من الأماكن العشرية ، فإن ذلك من شأنه أن يتحول مباشرة كما هو متوقع.

سيكون عليك دائمًا توخي الحذر مع أشياء مثل هذه. كما ذكر أعلاه ، فإن 10^-9 قريب بما يكفي من الصفر.

مأخوذة أيضا من MSDN:

بالإضافة إلى ذلك ، قد تختلف نتيجة العمليات الحسابية والتعيين مع قيم مزدوجة قليلاً حسب النظام الأساسي بسبب فقدان الدقة من النوع المزدوج. على سبيل المثال ، قد تختلف نتيجة تعيين قيمة مزدوجة حرفية في الإصدارات 32 بت و 64 بت من إطار .NET. يوضح المثال التالي هذا الاختلاف عندما تكون القيمة الحرفية -4.42330604244772E -305 ومتغيرًا تبلغ قيمته -4.42330604244772E -305 لمتغير مزدوج. لاحظ أن نتيجة طريقة Parse (سلسلة) في هذه الحالة لا تعاني من فقدان الدقة.

في أجهزة الكمبيوتر ، π/2 راديان لا تستطيع تساوي بالضبط 90 درجة ، لأن π هو عدد طويل بلا حدود. لذلك ، لا يمكن للمرء أن يتوقع تحديدًا مثاليًا مع π ، ما لم يكن الكمبيوتر ∞ بت.

لقد أدركت للتو:

-3.20510345 × 10-9 هو نفسه -0.00000000320510345 ، وهو قريب جدًا من الصفر.

يتم تحويل تحويل Google إلى Radian ، وهذا التقريب يسبب خطأ.

أظن أن JavaScript ، التي تشتهر بافتقارها إلى الدقة مع الأرقام ، تخلق أيضًا راديان غير صحيح ، وبالتالي فإن cosign هو الطريق.

لست متأكدًا من كيفية حل هذا - التقريب غير مقبول ، لأن ذلك لن ينجح لزوايا أخرى.

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