كيف بيئة (مثلا ، روبي) التعامل مع ضخمة الاعداد الصحيحه ؟

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

سؤال

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

أنا أسأل لأنني أريد أن تنفذ شيئا من هذا القبيل في برنامج C و أود أن أعرف كيف bignum + bignum يقلل من البدائية العمليات.

أي نصائح ؟

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

المحلول

بيثون يفعل ذلك أيضا.

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

فعلى سبيل المثال ، 99 * 99 هو أقل من 100 * 100 وهو 10,000, لذلك يمكن للمرء أن نفترض أن ضرب اثنين 2-أرقام سوف تنتج النتيجة لم يعد من 4 أرقام.نفس الشيء ينطبق عند كل رقم هو كلمة 32-بت.

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

نصائح أخرى

انظر إلى القسم 20.6 في الوصفات العددية للكتاب C: http://www.nrbook.com/a/bookcpdf.php

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

erlang يفعل هذا أيضا. يمكنك إلقاء نظرة على الكود المصدري (في C) في وحدة ERL_INTERFACE.

في الأساس ، يتلخص في الإضافة/الضرب/الانقسام/الطرح. هناك الكثير من التحسينات التي يمكن القيام بها من هناك (DUH) ، لذلك لا ينصح حقًا. أوصي بمراجعة مشروع GMP (GNU Multi-Specision) ، وهو روابط ثابتة أو ديناميكية في تطبيقك. ليس من الصعب استخدامها ، ولكن هناك عدد قليل من c ++ وغيرها من الأغلفة التي تتيح لك العمل معها بكل بساطة. إذا كنت تقوم بأشياء عائمة ، احصل على MPFR ، والتي تتعامل مع التقريب بشكل صحيح.

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