• 0
محمد علاء الدين

النوعين int128 و uint128

سؤال

قمت بكتابة مكتبة للتعامل مع الأرقام الصحيحه بحجم 128بت و 256بت، بالمرفقات محتويات المكتيه و التى بإيجاز هى كالتالي:

الفئه int128: تمثل رقم صحيح بإشاره و مكون من 128بت و تمثل الأرقام بحد أدني 170141183460469231731687303715884105728- و بحد أعلي 170141183460469231731687303715884105727.

الفئه uint128: تمثل رقم صحيح بدون إشاره و مكون من 128بت و تمثل الأرقام بحد أدني 0 و بحد أعلي 340282366920938463463374607431768211455.

الفئه int256: تمثل رقم صحيح بإشاره و مكون من 256بت و تمثل الأرقام بحد أدني 57896044618658097711785492504343953926634992332820282019728792003956564819968- و بحد أعلي 57896044618658097711785492504343953926634992332820282019728792003956564819967.

الفئات تحتوى على جميع العمليات التى تجعل استخدامهم يطابق استخدام الأنواع الأساسيه باللغه و النوع uint128 يحتوى على دالتين اضافيتين و هم rotateLeft و rotateRight.

تحتوى الفئات على الثابتين MinValue و MaxValue و اللذان يمثلان أقل و اكبر قيمه يمكن تخزينها بالفئه، ايضا توجد بعض الثوابت الأخرى.

تحتوى الفئات على الداله toString و التى تأخذ الشكل التالي:


enum Base { Dec, HexUpper, HexLower, Oct, Bin };
astr toString(Base base, int32* len) const;

حيث المعامل الأول هو الأساس الذى سيتم إعادة النص على هيئته و المعامل الثاني (إختياري) يعيد لك عدد الحروف داخل النص المعاد، النص الذى يتم إعاده هو static storage و دائما سيتم إعادة القيم به - و هذا يعنى انه لا يمكنك استخدام هذه الداله مع اكثر من thread.

عندما يتم تحويل رقم لنص للأساس الثنائي فالصيغه المعاده هي Little Endian.

ايضا توجد الداله fromString و التى تأخذ الشكل التالي:


static bool fromString(const astr buf, int128& i, Base base);
static bool fromString(const astr buf, uint128& i, Base base);

المعامل الأول هو النص الذى يحتوى على الرقم الذى سيتم تحويله، المعامل الثاني في حالة نجاح الداله سيحتوى على القيمه الرقميه او صفر فى حالة الفشل، المعامل الأخير هو نوع الرقم الموجود بالنص، إذا نجحت الداله ستعيد true و إذا فشلت ستعيد false.

النسخه التى تتعامل مع النوع int128 و int256 توجد بها حاله خاصه مع الأساس العشرى حيث يمكن للرقم أن يسبقه علامة + او -.

يوجد دعم لـ IOstream، أيضا يوجد دعم لـ manipulator التاليه:

hex - oct - dec - showbase - showpos - uppercase - left - right - setw - setfill

الملفات الموجوده بالمرفق هي:

btypes.h : تحتوى على الأنواع المستخدمه داخل الفئتين

int128.h : تحتوى على تصريح الفئه int128

int128.i : تحتوى على تضمين الدوال الـ inline الموجوده بالفئه int128

int128.cc: كود الفئه int128

uint128.h : تحتوى على تصريح الفئه uint128

uint128.i : تحتوى على تضمين الدوال الـ inline الموجوده بالفئه uint128

uint128.cc: كود الفئه uint128

int256.h : تحتوى على تصريح الفئه int256

int256.i : تحتوى على تضمين الدوال الـ inline الموجوده بالفئه int256

int256.cc: كود الفئه int256

iostream_support.h : تصريح معاملات الإدخال و الإخراج

iostream_support.cc: كود معاملات الإدخال و الإخراج

helper.h: يعض الدوال التى تساعد فى عمل الفئات و دوال الإدخال و الإخراج

nlimits.h: يحتوى على الفئه numeric_limits لـ int128 و uint128 و int256

********************************************************

قمت بكتابة برنامج لحساب المضروب بإستخدام int256


#include "btypes.h"
#include "int256.h"
#include <iostream>
#include "iostream_support.h"
using namespace std;

int main()
{
int256 acc = 1;

for (int32 i=2; i<58; i++)
{
acc *= i;
cout << setw(2) << right << i << "!: " << acc << endl;
}
}

و النتيجه:


2!: 2
3!: 6
4!: 24
5!: 120
6!: 720
7!: 5040
8!: 40320
9!: 362880
10!: 3628800
11!: 39916800
12!: 479001600
13!: 6227020800
14!: 87178291200
15!: 1307674368000
16!: 20922789888000
17!: 355687428096000
18!: 6402373705728000
19!: 121645100408832000
20!: 2432902008176640000
21!: 51090942171709440000
22!: 1124000727777607680000
23!: 25852016738884976640000
24!: 620448401733239439360000
25!: 15511210043330985984000000
26!: 403291461126605635584000000
27!: 10888869450418352160768000000
28!: 304888344611713860501504000000
29!: 8841761993739701954543616000000
30!: 265252859812191058636308480000000
31!: 8222838654177922817725562880000000
32!: 263130836933693530167218012160000000
33!: 8683317618811886495518194401280000000
34!: 295232799039604140847618609643520000000
35!: 10333147966386144929666651337523200000000
36!: 371993326789901217467999448150835200000000
37!: 13763753091226345046315979581580902400000000
38!: 523022617466601111760007224100074291200000000
39!: 20397882081197443358640281739902897356800000000
40!: 815915283247897734345611269596115894272000000000
41!: 33452526613163807108170062053440751665152000000000
42!: 1405006117752879898543142606244511569936384000000000
43!: 60415263063373835637355132068513997507264512000000000
44!: 2658271574788448768043625811014615890319638528000000000
45!: 119622220865480194561963161495657715064383733760000000000
46!: 5502622159812088949850305428800254892961651752960000000000
47!: 258623241511168180642964355153611979969197632389120000000000
48!: 12413915592536072670862289047373375038521486354677760000000000
49!: 608281864034267560872252163321295376887552831379210240000000000
50!: 30414093201713378043612608166064768844377641568960512000000000000
51!: 1551118753287382280224243016469303211063259720016986112000000000000
52!: 80658175170943878571660636856403766975289505440883277824000000000000
53!: 4274883284060025564298013753389399649690343788366813724672000000000000
54!: 230843697339241380472092742683027581083278564571807941132288000000000000
55!: 12696403353658275925965100847566516959580321051449436762275840000000000000
56!: 710998587804863451854045647463724949736497978881168458687447040000000000000
57!: 40526919504877216755680601905432322134980384796226602145184481280000000000000

mathX.rar

و الله ولي التوفيق

تم تعديل بواسطه محمد علاء الدين
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 0

جمييييييييييييييييل ;)

رجاءً قم بإزالة دوال min/max من الفئة, و بدلاً من ذلك قم بعمل specialization لـ numeric_limits. أنا في طور الاطلاع عليها و لكن عمل جميل بلا شك. هناك بعض الملاحظات في الـ Implementation سأعقب عليها عندما أنتهي من قراءة الكود.

تحياتي...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

تم تحديث المرفقات بالمشاركه الأولي و تم إضافة الملف nlimits.h الخاص بـ numeric_limits

و الله و لي التوفيق

تم تعديل بواسطه محمد علاء الدين
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .