لماذا هو System.Math ومثال Mathnet.Numerics بناء على ضعف؟

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

  •  16-09-2019
  •  | 
  •  

سؤال

جميع الأساليب في system.math. أخذ double كمعلمات وإرجاع المعلمات. الثوابت هي أيضا من النوع double. وبعد راجعت mathnet.numerics., ، ويبدو أن الشيء نفسه هو الحال هناك.

لماذا هذا؟ خاصة بالنسبة للثوابت. ليس كذلك decimal من المفترض أن تكون أكثر دقة؟ لن يكون ذلك في كثير من الأحيان مفيدة عند القيام بحسابات؟

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

المحلول

هذه هي التجارة الكلاسيكية - الدقة مقابل الدقة.

ومع ذلك، ضع في اعتبارك أنه بالنسبة ل PI، على سبيل المثال، فإن معظم الأرقام التي ستحتاج إليها هي 41.

أكبر عدد من الأرقام من PI التي ستحتاج إليها هي 41. لحساب محيط الكون مع وجود خطأ أقل من قطر البروتون، فأنت بحاجة إلى 41 رقما من PI †. يبدو من الآمن أن نستنتج أن 41 رقما تكون دقة كافية في PI لأي مشكلة قياس الدائرة التي من المحتمل أن تصادفها. وبالتالي، في أعلى أرقام تريليونات من PI المحسوبة في عام 2002، فإن جميع الأرقام التي تتجاوز 41 لا تملك قيمة عملية.

بالإضافة إلى ذلك، عشرية ومزدوجة لها هيكل تخزين داخلي مختلف قليلا. تم تصميم الكسور العشرية لتخزين بيانات قاعدة 10، حيث يتم تقديم الزوجي (وطوائف)، لعقد بيانات ثنائية. على آلة ثنائية (مثل كل جهاز كمبيوتر موجود) سيكون مزدوج بتضيع عدد أقل من البتات عند تخزين أي رقم داخل نطاقها.

يعتبر ايضا:

System.Double 8 Bytes حوالي ± 5.0e-324 إلى ± 1.7E308 مع نظام أرقام هام 15 أو 16 شخصا. 12 بايت 12 بايت تقريبا 1.0e-28 إلى ± 7.9e28 مع 28 أو 29 شخصيات مهمة

كما ترون، عشرية لديها مجموعة أصغر، ولكن دقة أعلى.

نصائح أخرى

لا، - الكسور العشرية ليست أكثر "بالضبط" من الزوجي، أو لهذه المسألة، أي نوع. مفهوم "دقة"، (عند التحدث عن التمثيلات العددية في كومبوريا)، هو ما هو الخطأ. أي نوع تماما 100٪ تماما في التمثيل بعض أعداد. البايتات غير الموقعة هي بالضبط 100٪ في تمثيل الأرقام بأكملها من 0 إلى 255. لكنها ليست جيدة للكسور أو السلبيات أو الأعداد الصحيحة خارج النطاق.

الكسور العشرية دقيقة بنسبة 100٪ في تمثيل مجموعة معينة من قاعدة 10. القيم. الزوجي (لأنهم يخزنون قيمتهم باستخدام الثنائية التمثيل الأسي IEEE) بالضبط في تمثيل مجموعة من الثنائية أعداد. لا يوجد أي ما هو أكثر بالضبط من الآخر بشكل عام، فهي ببساطة لأغراض مختلفة.

لوضع فورثر قليلا، حيث يبدو أنني لا أكون واضحا بما فيه الكفاية لبعض القراء ...

إذا كنت تأخذ كل عدد تمثل بمثابة عشري، وتمييز كل واحد منهم على خط عدد، بين كل زوج مجاور منهم هناك إضافي ما لا نهاية من الأرقام الحقيقية التي هي ليس تمثيلية كمرعي. يمكن إجراء نفس العبارة بالضبط حول الأرقام التي يمكن تمثيلها باعتبارها مزدوجة. إذا قمت بتمييز كل عشري على خط الأرقام باللون الأزرق، وكل مزدوج باللون الأحمر، باستثناء الأعداد الصحيحة، سيكون هناك عدد قليل جدا من الأماكن التي تم وضع علامة فيها نفس القيمة في كلتا اللونين. بشكل عام، مقابل 99.99999٪ من العلامات، (من فضلك لا nitpick نسبة مئوية) المجموعة الأزرق (الكسور العشرية) هي مجموعة مختلفة تماما من الأرقام من المجموعة الحمراء (الزوجي).

هذا لأنه نظرا لتعريفنا للغاية بالنسبة للمجموعة الزرقاء هو أنه قاعدة 10 مانيسا / التمثيل الأساسي، ومزددا مزدوجا هو تمثيل مانتيسا / الأساس. أي قيمة ممثلة كقاعدة 2 مانتيسا والرضا، (1.00110101001 x 2 ^ (-11101001101001) يعني أخذ قيمة المانيسا (1.00110101001) اضربها بنسبة 2 التي أثيرت على قوة الأساس (عندما يكون الأسهم سلبيا، هذا متساوي للقسمة بنسبة 2 إلى قوة القيمة المطلقة للأسف). هذا يعني أنه عندما يكون الأسف السلبي، (أو عندما يكون أي جزء من Mantissa ثنائي كسور) لا يمكن تمثيل الرقم كمركزي عشري ورأسي، والعكس صحيح.

لأي رقم حقيقي تعسفي، يؤدي ذلك عشوائيا إلى خط الأرقام الحقيقية، سيكون أقرب إلى إحدى الكسور العشرية الزرقاء أو إلى أحد الزوجي الأحمر.

عشري هو أكثر دقة ولكن لديها أقل من النطاق. يمكنك الاستخدام بشكل عام مزدوج للفيزياء والحسابات الرياضية ولكنك ستستخدم العشرية للحسابات المالية والنقدية.

راجع المقالات التالية على MSDN للحصول على التفاصيل.

مزدوجhttp://msdn.microsoft.com/en-us/library/678hzkk9.aspx.

عدد عشريhttp://msdn.microsoft.com/en-us/library/364x0z75.aspx.

يبدو أن معظم الحجج هنا "لا تفعل ما أريد"، لكنه أسرع "، وكذلك مكتبة ANSI C + GMP، ولكن لا أحد يدافع عن ذلك الصحيح؟

إذا كنت ترغب بشكل خاص في التحكم في الدقة، فهناك لغات أخرى اتخذت الوقت لتنفيذ الدقة الدقيقة، بطريقة يمكن التحكم فيها للمستخدم:

http://www.doughellmann.com/pymotw/decimal/

إذا كان الدقة مهمة حقا بالنسبة لك، فمن المحتمل أنك أفضل حالا باستخدام اللغات التي سيستخدمها علماء الرياضيات. إذا كنت لا تحب Fortran، فبيثون هو بديل حديث.

أيا كانت اللغة التي تعمل فيها، تذكر القاعدة الذهبية: تجنب أنواع الخلط ... لذلك قم بتحويل A و B لتكون هي نفسها قبل أن تحاول مشغل B

إذا كنت في خطر تخمين، أود أن أقول تلك الوظائف الاستفادة من وظائف الرياضيات ذات المستوى المنخفض (ربما في ج) لا تستخدم الكسور العشرية داخليا، وكذلك إرجاع العشرية سيتطلب من المزدوج إلى عشري على أي حال. علاوة على ذلك، فإن الغرض من نوع القيمة العشرية هو ضمان الدقة؛ هذه الوظائف لا و لا تستطيع إرجاع نتائج دقيقة بنسبة 100٪ دون الدقة اللانهائية (مثل أرقام غير عقلانية).

لا العشرية ولا تعويم أو مزدوجة جيدة بما فيه الكفاية إذا كنت بحاجة إلى شيء دقيق. علاوة على ذلك، العشرية مكلفة للغاية ومفوقة هناك أصبحت مزحة منتظمة.

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

المشكلة الفعلية مع CLR بشكل عام هي أنه من الغريب جدا ومكسر عادي لتنفيذ مكتبة تتعامل مع العدامات باللون الأزياء العامة بسبب التصميم البدائي السيئ وعصور التحويل البرمجي الأكثر شعبية للمنصة. انها تقريبا نفس الشيء كما هو الحال مع Java Fiasco.

Double، تبين أن أفضل حل وسط يغطي معظم المجالات، وأنه يعمل بشكل جيد، على الرغم من حقيقة أن MS Jit لا تزال غير قادرة على استخدام تكنولوجيا وحدة المعالجة المركزية التي تبلغ من العمر 15 عاما الآن.

قطعة للمستخدمين من محامرة SPALDown MSDN

المزدوج هو نوع مدمج. يتم دعمه بواسطة FPU / SSE Core (المعروف سابقا باسم "Coprocessor الرياضيات")، ولهذا السبب سريعا للغاية. خاصة في الضرب والوظائف العلمية.

العشري هو في الواقع هيكل معقد، يتكون من العديد من الأعداد الصحيحة.

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