كيف يتم تنفيذ المكتبات الرياضية بدقة لا متناهية؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

لذا فأنا أعرف دقة الفاصلة العائمة (وكيف أن أشياء مثل 1.1 لا يمكن التعبير عنها تمامًا بالنظام الثنائي) وكل ذلك، لكنني أتساءل:فكيف تقوم المكتبات المتعلقة بالرياضيات بتنفيذ الدقة اللانهائية؟بمعنى آخر، كيف يمكنك، على سبيل المثال، تمثيل 1.1 بدقة في النظام الثنائي؟مجرد وصف موجز سيكون رائعًا، يمكنني معرفة التفاصيل الدقيقة بنفسي.شكرًا.:)

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

المحلول

ولا توجد مكتبات الدقة لانهائية، ولكن هناك مكتبات الدقة التعسفي. للحصول على تفاصيل كيفية تنفيذ هذه، وقراءة بعض الوثائق : -)

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

نصائح أخرى

إذا كنت تقصد حقًا الدقة اللانهائية، فهناك خياران:

  • استخدم شكلاً من أشكال الحساب البطيء.بعد ذلك يمكنك أن تطلب من رقم ما الدقة التي تريدها "بعد" تنفيذ الحساب (نظرًا لأنه بطيء، فقد تم ذلك في الواقع فقط).العيب هو أن هذا غير فعال للغاية.يمكنك القيام بذلك بلغة مثل هاسكل باستخدام نظام أرقام خاص حيث تتداخل التمثيلات، على سبيل المثال.القاعدة 2 بالأرقام -1، 0، 1.التمثيل المعتاد غير مناسب، لأنه عند 1 على سبيل المثال، تحتاج إلى دقة لا نهائية للاختيار بين إخراج 0 مقابل 0.999...و 1 بـ 1.000...

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

والمكتبات الرياضية مع لم يتم تنفيذ انهائية الدقة. لا يمكن القيام به. عدد 1/3 لا يمكن أن تكون ممثلة في عدد محدود من أجزاء أخرى من ككسر. أرقام متعال مثل بي والبريد لا يمكن تمثيلها تماما في أي الموضة.

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

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

بعض الأمثلة:

  • يتم إغلاق الأعداد الصحيحة تحت الجمع والضرب.

  • الكسريات مغلقة أيضًا تحت القسمة، باستثناء حالة خاصة للصفر.يمكن تمثيلها كزوج من الأعداد الصحيحة.أنظر أيضاً وظائف الرقم العقلاني في GMP.على سبيل المثال، 1.1 = 11/10، يمكن تمثيلها بالشكل (11، 10).

  • نوع رقم مغلق أيضًا تحت الجذر التربيعي.

ويمكنك أيضا أن تمثل الأرقام في العشرية والحساب العشري. تمثيل الأساسي هو ثنائي، بمعنى أن يتم تمثيل كل أرقام مع رمز ثنائي. كل رقم - سواء إلى اليمين أو اليسار الفاصلة العشرية - يعامل كعدد. الحساب ثم يتم القيام به `` يدويا ''، أرقام من أرقام.

ومثال واحد من مكتبة القائم عشري هو BCMath في PHP.

وبينما باكس هو تماما هنا عندما نتحدث عن نقاط وأرقام العائمة، وأعتقد أن هناك حل إلا أنها فعالة للغاية.
يمكنك استخدام سلسلة لتمثيل رقم هاتفك، سلاسل لا خسارة الدقة.
كلما كان لديك عدد مثل "0.0001" + "0.1" كنت تكرار كلا سلسلة وفقط تحويل الوضع الحالي إلى int.
الخطوة 1:
0 + 0 = 0 -> تحويل إلى سلسلة وتعيين لبيانات [0]
. الخطوة 2:
0 + 1 = 1 -> تحويل إلى سلسلة وتعيين لبيانات [1]
. الخطوة 3:
ايتر> "0.1" .lenght () -> توقف

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