السلام عليكم ,,
في الحقيقة إن موضوع الأعداد الكبيرة جداً أو بمعنى أصح Arbirary Precesion Numbers هو موضوع جميل في عالم البرمجة. و لكن للأسف الكثير ممن في المنتدى هم من المبتدئين أمثالي. و حساب هذا النوع من الأعداد بشكل يدوي من خلال كود نقوم بكتابته بأنفسا قد يشكل عقبة في الاستفادة من قدرة الحاسب في حساب أرقام عملاقة جداً تصل إلى آلاف الخانات لتعقيد المسألة من ناحية, و صعوبة الحصول على السرعة و الكود الخالي من الأخطاء من ناحية أخرى. يستخدم المبرمجون في معظم الحالات مكتبات جاهزة تمت كتابتها على أيدي خبراء في البرمجة. أشهر المكتبات بلا منازع في هذا المجال هي المكتبة الشهيرة من منظمة البرمجيات الحرة Free Software Foundation, و تسمى gmp. رغم أن هذه المكتبة هي الأفضل في المجال إلا أنني لم أجد طريقة تمكنني من العمل عليها تحت Visual Studio 2008 بشكل سهل و مباشر. لتعقيد عملية بناء المكتبة و كثرة خيارات البناء و تضمين أكواد أسمبلي مكثفة للعديد من المنصات الموجود على سطح الكرة الأرضية. و لكن ترجمتها على GCC أسهل بكثير حسبما أعتقد لأنه المترجم الرئيسي للمكتبة. ربما لاحقاً سأضيف كيفية استخدام المكتبة بواسطة GCC و Visual Studion و لكن ليس في القريب العاجل. بحثت عن مكتبة سهلة الإستخدام يمكن بسهولة العمل عليها باستخدام Visual Studio 2008 و وجدت المكتبة المسماة MAPM و هي اختصار لـ Michael Arbitrary Precesion Math, على اسم مصممها الأصلي. و هي مكتبة جميلة و سهلة الاستخدام جداً, إضافة إلى امكانية العمل عن طريقها مع الأعداد الصحيحة و الأعداد الحقيقة... و لا ننسى بعض الدوال الرياضية التي يحتاجها أي منا, إضافة إلى أنها مستخدمة في عدة مشاريع شهيرة
دعنا لا نطيل الحديث و نسرد كيفية بناء المكتبة و كيفية كتابة أول مثال لنا.....
في البداية قم بتحميل المكتبة من هنا, و هذا هو الإصدار 4.9.5 :
قم بفك الضغط عن مجلد المكتبة و ليكن المجلد الذي تتربع به الملفات بالاسم التالي : mapm
بالطبع أنت من المبرمجين أمثال الذين يفضلون العمل على الـ IDE الخاص بـ Visual Studio و لا أظنك تترجم برامجك من خلال الـ Command Line, لذلك لن تكون الـ Enivronment Variable قد تمت تنشيطها لديك, ببساطة لن يمكن استخدام مترجم ++VC من سطر الأوامر, كل ما علينا فعله هو التالي....
اذهب إلى مجلد Bin في المجلد الرئيسي لـ VC و لدي على العنوان التالي بالطبع باستخدام سطر الأوامر و قم بكتابة الأمر التالي على افتراض أن هذا هو مسار المجلد Bin لديك :
و بعد الضغط على ENTER و تنفيذ الأمر ...
كل ما في الأمر أننا قمنا باستخدام الـ Batch الذي توفره Visual Studio بدلا من إضافة المترجم و الأدوات الأخرى يدوياً إلى قائمة الـ Environment Variables الخاصة بـ Windows ....
الآن سنتوجه إلى المجلد الذي وضعنا فيه ملفات المكتبة و المسمى mapm و نبحث عن الملف التالي و نقوم بتشغيله, الحقيقة أن هذا الملف ليس إلا Batch يقوم بعملية ترجمة المكتبة بشكل أوتوماتيكي باستخدام مترجم ++VC .... الملف يسمى MKALLMSC.bat .... و بعد الضغط على ENTER ستتم عملية بناء المكتبة..
خطوة بسيطة باقية و هي التأكد من أن المكتبة بنيت بشكل صحيح, أحياناً المترجمات بسبب خواص الـ Optimizations قد تنتج كود لا ينفذ المطلوب لذلك قم مصمم المكتبة بإرفاق برنامج للتأكد قم بكتابة الأمر التالي من نفس المسار السابق...
إذا تمت عملية التحقق بنجاح ...
مبروك انتهينا, المكتبة أصبحت جاهزة للاستخدام و ما بقي علينا إلا استخدامها في مثال, قمت بكتابة مثال بسيط جداً لكي تقوم بتجربة المكتبة و التأكد بأنها تعمل.... حتى نلخص ما قمنا بعمله, قمنا ببناء Static Library من المكتبة. سنرى الآن كيف سنقوم بكتابة أول مثال و كيف سنقوم بربط المكتبة. ملاحظة صغيرة فقط, إذا كانت برنامجك MultiThreaded فتحتاج إلى بعض الإعدادات الأخرى التي يمكنك الإطلاع عليها في موقع المكتبة نفسه لبناء المكتبة على أنها Thread Safe :)....
قم بإنشاء مشروع حسب ما تريد سواء GUI أو Console .. مثالنا يستخدم الـ Console لغرض توضيح استخدام المكتبة لا أكثر ....
اذهب إلى مجلد المكتبة, ستجد ملفين. الأول يسمى mapm.lib و الثاني m_apm.h قم بنسخهما و لصقهما في مجلد مشروعك...
نحن جاهزون الآن لتجربة المكتبة :)
قم بكتابة الكود التالي :
[color= #007f00;]#define NULL 0
[color= #007f00;]#include "m_apm.h"
[color= #007f00;]#include <iostream>
[color= #007f00;]#pragma comment ( lib, "mapm.lib" )
[color= #0000ff;]int main[color= #000000;]([color= #000000;])[color= #000000;]{
m_apm_cpp_precision[color= #000000;]( [color= #ff0000;]1994 [color= #000000;]);
MAPM e [color= #000000;]= [color= #A31515;]"2.0E+0";
[color= #0000ff;]char buff[color= #000000;][ [color= #ff0000;]2000 [color= #000000;]];
[color= #0000ff;]for[color= #000000;]( MAPM i [color= #000000;]= [color= #A31515;]"2"; i [color= #000000;]< [color= #A31515;]"1000"; i[color= #000000;]++ [color= #000000;])
e [color= #000000;]+[color= #000000;]= [color= #000000;]( [color= #A31515;]"1.0E+0" [color= #000000;]/ i.[color= #808000;]factorial[color= #000000;]([color= #000000;]) [color= #000000;]);
e.[color= #808000;]toString[color= #000000;]( buff, [color= #ff0000;]1994 [color= #000000;]);
std[color= #000000;]::[color= #808000;]cout [color= #000000;]<< buff;
std[color= #000000;]::[color= #808000;]cin.[color= #808000;]get[color= #000000;]([color= #000000;]);
[color= #0000ff;]return [color= #ff0000;]0;
[color= #000000;]}هذا الكود يقوم بحاسب قيمة العدد e إلى 1994 خانة :)
إذا لم تظهر النتيجة على شاشة الـ Console بسرعة فلا تعتقد أن هناك خطأ, و لكن البرنامج يقوم بالحساب .... لذلك قد يتأخر البرنامج على حسب مواصفات جهازك. تذكر فما لديك هو حاسوب شخصي ....
ملاحظة صغيرة فقط, لاحظت أن كود المكتبة يحتوي على NULL و التي ليست معرفة أصلاً في لغتي C و ++C و ربما اعتقد كاتب المكتبة أن windows.h سوف يستخدمه معظم مستخدمو مكتبته. لذلك إذا لم تكن تستخدم windows.h فقط قم بإضافة السطر التالي قبل كل شيء :)
#define NULL 0
أدعك الآن لتكتشف طريقة استخدام المكتبة و دوالها... من خلال موقعها الأصلي.
ستجد أيضاً في مجلد المكتبة مجلداً فرعياً يسمى DOCS قم بالإطلاع على جميع الملفات الموجودة فيه بأي محرر نصوص, فهو يحتوي على شرح لجميع دوال المكتبة إضافة إلى سبب اختيار بعض الخوارزميات المستخدمة في المكتبة..
تحياتي ,,



