PDA

View Full Version : ذخیره اعداد بزرگ در سی



benyamin_pc
چهارشنبه 13 دی 1385, 13:16 عصر
سلام
عدد 10^4 به بالا را چجوری میشه نگهداری کرد ؟
تو سی

sh_roohani
چهارشنبه 13 دی 1385, 13:36 عصر
سلام،
فکر می کنم int64__ به دردتون بخوره. ولی آخه شما تو چه محیطی کار می کنین؟ مطمئن نیستم اینی که گفتم استاندارد هست یا نه، ولی اگه درست یادم باشه یکی دو جا اشاراتی دیدم که C99 از این نوع پشتیبانی می کنه. من که تو 2003 ++VC به کار می برم و خوب کار می کنه.

alireza643
چهارشنبه 13 دی 1385, 13:49 عصر
یه آرایه هم میتونید درست کنید که هر عنصر اون یکی از ارقام عدد مورد نظر باشه که این دیگه واسه اعداد خیلی بزرگه ولی تمام اعمال رو باید دستی بنویسید.

mortez maya
پنج شنبه 14 دی 1385, 01:52 صبح
به هر حال بالاخره باید آرایه رو هم بازیابی کنیم و عدد به دست اومده رو تو حافظه استفاده کنیم اون موقع باز مشکل تعریف متغیر به اون بزرگی پیش میاد!

yashar666
پنج شنبه 14 دی 1385, 02:30 صبح
اگه عدد شما از نوع عشاری خیلی بزرگ باشه ازdouble استفاده کنی فکر کنم مشکلی نباشه اگه هم int هست از int64

benyamin_pc
پنج شنبه 14 دی 1385, 03:36 صبح
دوستان من با سی برنامه می خوام اون که تو یه صفحه داسی باز میشه
اما این چیزارو امتحان کردم هیچ کدوم فایده نداره اگرم تو آرایه بریزم همون جور که دوستمون گفتن در هنگام بازیابی کارو خراب میکنه در واقع راهش رو پیدا کردم اما نه کاملا
اگر از دبل استفاده شه اعداد کوچیک رو وقتی بخواهیم ازش پرینت اف بگیریم 0 نمایش میده
برای اعداد بزرگ هم اشتباه نمایش میده
اما راه همینه استفاده از دبل و برای رفع مشکل در هنگام پرینت اف هم باید با درصد اف نمایش داده شود که این هم یه مشکل ایجاد می کند عدد به صورت اعشاری نمایش داده می شود و در هنگام انجام عملیات مثلا اگر با عدد 11111111111111111111111 کار می کردیم
حالا به عدد 11111111111111111110700 می رسیم یعنی از عدد ما کاسته شده اما با امتحان هایی که کردم این مربوط میشه به نمایش عدد و عدد در حافظه همچنان 11111111111111111111111 است و از آن اپسیلونی کم نمی شود اما چجوری متغییر را نمایش دهیم؟!

mortez maya
پنج شنبه 14 دی 1385, 23:58 عصر
اتفاقا من هم دارم یه پروژه می نویسم که توی اون از اعداد بزرگ متشکل از صفر و یک مثل 0111001111011101 استفاده می کنم من ابتدا این عدد رو به شکل یک رشته میگیرم و سپس با توابعی مثل atol یا strtod اونو تبدیل می کنم ولی 2 تا مشکل دارم اول اینکه در هنگام تبدیل اون صفر اولی لحاظ نمیشه اما از این مشکل که طبیعیه بگذریم موندم این عدد رو تو چه متغیری بریزم و مهمتر اینکه با چه % اون رو پرینت کنم؟

benyamin_pc
جمعه 15 دی 1385, 04:13 صبح
انگار تنها راه همینه که همون طور که گفتم با آرایه کار کنید و نهایتن اونو تو یه دبل بریزین ولی نمایشش ندین و دوباره اونو تو آرایه برگردونین حالا آرایه را چاپ کنین
چون اون متغییر تو حافظه صحیحه

mortez maya
شنبه 16 دی 1385, 23:26 عصر
خوب اینطوری اگه بخواییم با عدد مورد نظر کارای محاسباتی بکنیم با مشکل روبرو میشیم؟!

benyamin_pc
یک شنبه 17 دی 1385, 05:32 صبح
نه برا چی؟

mzjahromi
یک شنبه 17 دی 1385, 12:45 عصر
double توانائی ذخیره سازی اعداد بزرگ رو داره ولی تا 17 رقم با معنی رو بیشتر نمیتونه پشتیبانی کنه. یا به عبارتی اگر شما کل ارقامتون عددی غیر صفر باشه 17 تا شو بیشتر نمی تونه براتون نگه داره ولی اگه 16 تا رقم غیر صفر داشته باشید و در انتها تعداد زیادی صفر داشته باشید میتونه واسه تون نگهداری کنه. امیدوارم مفهوم حرفم رو درک کرده باشید اگر اینطور نیست بد نیست به معنی ارقام با معنی در ریاضیات(اگه اشتباه نکنم ریاضیات گسسته) یه نگاهی بندازید.



همونطور که یکی از دوستان هم گفتن ساده ترین روش ذخیره به صورت رشته ای است. و برای نمایش هم باید اعداد را تک تک نمایش بدی و برای عملیات محاسباتی هم باید تابعش رو خودت پیاده سازی کنی.

اما اگر برای ذخیره سازی بخوای در فضای حافظه صرفه جوئی کنی می تونی به صورت BCD ذخیره اش کنی که در اینصورت مقدار حافظه مصرفی نصف حالت قبل است.

یه راه دیگه هم استفاده از Integer های چند گانه هست (پیاده سازی Int64) یا بالاتر برای کامپایلر هائی که پشتیبانی نمی کنن. (که باز هم در حافظه صرفه جوئی بیشتری میشه)
کلا هر سه روش فوق نیاز به یک ADT برای نمایش , خواندن , جمع , تفریق, ضرب,تقسیم و سایر اعمال مورد نیاز روی اون نمونه اعداد دارد