امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
اعداد جنی !!!!!!!!!!!
نویسنده پیام
NabiKAZ آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 520
موضوع‌ها: 48
تاریخ عضویت: اسفند ۱۳۸۲

تشکرها : 6
( 60 تشکر در 46 ارسال )
ارسال: #1
اعداد جنی !!!!!!!!!!!
سلام

ویژوال بیسیک رو باز کنید.
این کد رو بنویسید و اجرا کنید:

x = 20000 + 20000

خیلی جالبه نه ؟! خطای سرریز میده !!!

حالا اینو اجرا کنید که معادل همون بالاییه:

x = 20000 / 20000 * 20000 + 20000

میبینید که اجرا میشه !!!!!

فکر میکنم درستش این باشه که طرفین عملگر ابتدا در متغییر ریخته بشن یعنی اینجوری:
a = 20000
b = 20000
x = a + b

ولی شاید خود a دارای عملیات باشه . اینجوری برنامه بیخود پیچیده میشه ...
ضمنا تست کردم به نوع متغییر ها هم مربوط نمیشه .

حالا یه چیز دیگه ، شاید به ذهنتون برسه که عمل جمع توانایی محاسبه اعداد بزرگ رو نداره ، پس به مثال های زیر توجه کنید:


x = 20 + 20
x = 200 + 200
x = 2000 + 2000
x = 20000 + 20000
x = 200000 + 200000
x = 2000000 + 2000000
x = 20000000 + 20000000
x = 200000000 + 200000000
x = 2000000000 + 2000000000
x = 20000000000 + 20000000000

ملاحظه میکنید که تنها خطوطی که با رنگ قرمز است اجرا نمیشه ! و در مورد اعداد بزرگتر یا کوچکتر مشکلی نیست ....
نتیجه همون موضوع تاپیکه !!! درست نمیگم ؟
یادتونه قبلا یه تاپیک با نام "دیتا بیس جنی !!!" زده بودم ، در نهایت همه به این موضوع رسیدیم . حالا هم فکر میکنم مورد مشابه است !!!

خیلی عجیبه !
کسی میتونه توضیح بده این اشکال از کجا آب میخوره ؟!
و راه حلش چیه؟!

نبی

(آخرین ویرایش در این ارسال: ۱۴-اردیبهشت-۱۳۸۵, ۰۳:۵۵:۱۲، توسط NabiKAZ.)
۱۴-اردیبهشت-۱۳۸۵, ۰۳:۰۰:۲۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #2
RE: اعداد جنی !!!!!!!!!!!
وقتي متغير تعريف نشه variant فرض ميشه.
احتمالا وقتي مينويسي x = 20000 + 20000 متغير رو variant فرض ميكنه ولي فضايي كه بهش ميده اندازه اينتيجره. ولي وقتي تقسيم ميذاري اندازه دوبل بهش فضا ميده.
۱۴-اردیبهشت-۱۳۸۵, ۰۴:۰۰:۱۶
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #3
RE: اعداد جنی !!!!!!!!!!!
x = 20 + 20
x = 200 + 200
x = 2000 + 2000
x = 20000 + 20000
x = 200000 + 200000
x = 2000000 + 2000000
x = 20000000 + 20000000
x = 200000000 + 200000000
x = 2000000000 + 2000000000
x = 20000000000 + 20000000000

در اين مورد ميخواستم بگم شايد مثلا تا موقعي كه اعداد 5 رقمين اندازه اينتجر فضا ميده. ولي تعداد اعداد كه زياد ميشه اندازه دوبل و لانگ فضا ميده. ولي اگه از همون اول x رو لانگ هم تعريف كنيد سر 20000+20000 خطاي سر ريز ميده.
۱۴-اردیبهشت-۱۳۸۵, ۰۴:۰۸:۰۹
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
ashkan آفلاین
بنيانگذار سايت
******

ارسال‌ها: 1,553
موضوع‌ها: 80
تاریخ عضویت: آبان ۱۳۸۲

تشکرها : 0
( 140 تشکر در 87 ارسال )
ارسال: #4
RE: اعداد جنی !!!!!!!!!!!
جالب بود راست ميگي عجيبه.
يادمه تو پاسكال 6 هم وقتي يه آرايه بزرگ تعريف ميكردي - متغيري رو اگه بعد از اون آرايه تعريف ميكردي مقدار متغير هر لحظه عوض ميشد و مقدار دادن هم تاثير نداشت.

آشنایی با نظریه زبان باعث شد تا بفهمم کامپیوتر اونی نیست که من میدونم.
۱۴-اردیبهشت-۱۳۸۵, ۰۸:۰۹:۲۶
وب سایت ارسال‌ها
پاسخ
NabiKAZ آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 520
موضوع‌ها: 48
تاریخ عضویت: اسفند ۱۳۸۲

تشکرها : 6
( 60 تشکر در 46 ارسال )
ارسال: #5
RE:  اعداد جنی !!!!!!!!!!!
Payman62 نوشته است:وقتي متغير تعريف نشه variant فرض ميشه.
احتمالا وقتي مينويسي x = 20000 + 20000 متغير رو variant فرض ميكنه ولي فضايي كه بهش ميده اندازه اينتيجره. ولي وقتي تقسيم ميذاري اندازه دوبل بهش فضا ميده.

احتمالا اینطوره که شما میگید.
چون اتفاقا من یه تایمر در برنامم دارم که هر ثانیه یه شماره میندازه و مقدار ساعت و دقیقه و ثانیه رو به صورت رشته های جدا نشون میده ولی درون متغییر معادل ثانیه ای اون رو دخیره میکنه. برنامه خوب کار میکنه تا زمانی که 9 ساعت و 6 دقیقه و 7 ثانیه سپری میشه (اگر این رو به ثانیه برگردونید میشه 32767 که درست ماکزیمم مقدار متغییر integer است!) اما درست در لحظه ای که ثانیه یکی افزایش میابد، برنامه خطا میده ! این نشون میده مقدار حافظه تخصیص داده شده integer است. اما چرا زمانی متغییر رو از نوع long تعریف میکنم باز هم این مشکل بروز میکنه ! ظاهرا کاری نداره که متغییر چی باشه . مستقیما به عملگر نگاه میکنه و در صورتی که به اضافه باشه integer و در صورتی که به قول شما تقسیم باشه حافظه بیشتری تخصیص میده .. اما حالا اگر به عملگر نگاه میکنه پس چرا در صورت استفاده از متغییر مشکلی بروز نمیکنه !!! حتی در صورتی که اعداد دو طرف عملگر به صورت ثابت (Const) تعریف بشن به دلیل مطلق بودن اعداد باز هم برنامه خطا میده .
خلاصه هر جاش رو بگیریم یه جاش در میره .
البته من مشکل رو اینجوری حل کردم که مجبور شدم اعداد ثابتی که در عبارت ریاضیم وجود داشت از جمله اعداد 60 و 3600 رو به صورت متغییر long تعریف کردم (integer هم نشد!!!!) و در ابتدای برنامه این مقادیر رو به متغییرهاشون نسبت دادم و در عملیات ریاضی ازشون استفاده کردم . یعنی مثل یه متغییر باهاشون برخورد کردم و مشکل حل شد.

دلیلی هم که شما دوست عزیز ارائه دادید به نظرم خوب و منطقی بود . ولی این دلیل نمیشه که بیلی به دلیل این باگ های مسخره فحش نخوره !!!!!!

چاریم
نبی

۱۴-اردیبهشت-۱۳۸۵, ۰۹:۰۳:۱۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
ha_60 آفلاین
بنيانگذار سايت
******

ارسال‌ها: 4,637
موضوع‌ها: 216
تاریخ عضویت: آبان ۱۳۸۳

تشکرها : 560
( 6556 تشکر در 2385 ارسال )
ارسال: #6
RE: اعداد جنی !!!!!!!!!!!
اگه جنی باشه که جن گیر می خواد Biggrin
ولی عدد 20000 یه signed int هست (یعنی اینتیجر علامت دار) و وقتی با خودش جمع بشه از یه Signed int می زنه بالاتر برای حل این مشکل تو سی از casting استفاده می کنن تو یه پرانتز نوع عدد رو مشخص می کنن مثلا (unsigned int) البته برای اعداد ثابت ته عدد هم یه چیز هایی اضافه می کنن مثل 123450000UL توی ویبی احتمالا باید نوع متغیر رو صراحتا مشخص کنی تا این مشکل پیش نیاد
برای اعداد بزرگتر هم که می دونید مثلا 200000 یه 3 بایتیه که احتمالا یه word شناسایی می شه و جمعش از word بیشتر نمی شه تا همون عدد قرمز دوم که خودش word ولی جمعش ار word بیشتر

هادی امین زاده
دیدن چیزی که همه می بینند هنر نیست
بانک اطلاعات صنایع ایران.
۱۴-اردیبهشت-۱۳۸۵, ۰۹:۰۷:۲۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
NabiKAZ آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 520
موضوع‌ها: 48
تاریخ عضویت: اسفند ۱۳۸۲

تشکرها : 6
( 60 تشکر در 46 ارسال )
ارسال: #7
RE:  اعداد جنی !!!!!!!!!!!
Payman62 نوشته است:x = 20 + 20
x = 200 + 200
x = 2000 + 2000
x = 20000 + 20000
x = 200000 + 200000
x = 2000000 + 2000000
x = 20000000 + 20000000
x = 200000000 + 200000000
x = 2000000000 + 2000000000
x = 20000000000 + 20000000000

در اين مورد ميخواستم بگم  شايد مثلا تا موقعي كه اعداد 5 رقمين اندازه اينتجر فضا ميده. ولي تعداد اعداد كه زياد ميشه اندازه دوبل و لانگ فضا ميده. ولي اگه از همون اول x رو لانگ هم تعريف كنيد سر 20000+20000 خطاي سر ريز ميده.

من که با استدلال شما مخالفم ! به خاطر اینکه مبنای کامپیوتر و برنامه های کامپیوتری تعداد ارقام نیست . بلکه بایت حافظه است. و به عنوان مثال فرضاً در مورد متغییر های integer اصلا ویژوال بیسیک تفاوتی بین 3 و 33 و 333 و 3333 قائل نیست چون در محدوده حافظه مجاز هستند و اونها رو مجاز میدونه ولی بین اونها و عدد 33333 تفاوت قائل میشه ، البته تفاوت ناشی از تعداد زیاد ارقام نیست! بلکه در میزان فضای غیر مجاز اشغالی است.

در مورد مثال بالا هم که بنده عرض کردم عجیب است! واقعا عجیب است!

تشکر
نبی

۱۴-اردیبهشت-۱۳۸۵, ۰۹:۱۵:۱۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
NabiKAZ آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 520
موضوع‌ها: 48
تاریخ عضویت: اسفند ۱۳۸۲

تشکرها : 6
( 60 تشکر در 46 ارسال )
ارسال: #8
RE:  اعداد جنی !!!!!!!!!!!
ashkan نوشته است:جالب بود راست ميگي عجيبه.
يادمه تو پاسكال 6 هم وقتي يه آرايه بزرگ تعريف ميكردي - متغيري رو اگه بعد از اون آرايه تعريف ميكردي مقدار متغير هر لحظه عوض ميشد و مقدار دادن هم تاثير نداشت.

پس شما هم در مورد جنی بودن این اعداد با بنده هم عقیده هستند ;)
منتظر موارد جنی دیگر ویژوال بیسیک باشید.

نبی

۱۴-اردیبهشت-۱۳۸۵, ۰۹:۱۵:۵۳
وب سایت ارسال‌ها
پاسخ
NabiKAZ آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 520
موضوع‌ها: 48
تاریخ عضویت: اسفند ۱۳۸۲

تشکرها : 6
( 60 تشکر در 46 ارسال )
ارسال: #9
RE:  اعداد جنی !!!!!!!!!!!
ha_60 نوشته است:اگه جنی باشه که جن گیر می خواد Biggrin
ولی عدد 20000 یه signed int هست (یعنی اینتیجر علامت دار) و وقتی با خودش جمع بشه از یه Signed int می زنه بالاتر برای حل این مشکل تو سی از casting استفاده می کنن تو یه پرانتز نوع عدد رو مشخص می کنن مثلا (unsigned int) البته برای اعداد ثابت ته عدد هم یه چیز هایی اضافه می کنن مثل 123450000UL توی ویبی احتمالا باید نوع متغیر رو صراحتا مشخص کنی تا این مشکل پیش نیاد
برای اعداد بزرگتر هم که می دونید مثلا 200000 یه 3 بایتیه که احتمالا یه word شناسایی می شه و جمعش از word بیشتر نمی شه تا همون عدد قرمز دوم که خودش word ولی جمعش ار word بیشتر

کسی فهمید حامد چی گفت ؟!
اشتباه برداشت نشه . اشکال کار از IQ بنده است. شرمنده ....

پ.ن: راستی مبارکه میبینم که مدیر انجمن موبایل شدی . جدی جدی حالا خوره ای تو این زمینه ؟ من میخوام برا p910i برنامه بنویسم میتونی کمکم کنی؟

چاکریم

(آخرین ویرایش در این ارسال: ۱۴-اردیبهشت-۱۳۸۵, ۰۹:۲۰:۱۶، توسط NabiKAZ.)
۱۴-اردیبهشت-۱۳۸۵, ۰۹:۱۸:۳۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
Iron_Fist غایب
مدیر بازنشسته
*****

ارسال‌ها: 1,456
موضوع‌ها: 70
تاریخ عضویت: آبان ۱۳۸۴

تشکرها : 109
( 456 تشکر در 134 ارسال )
ارسال: #10
RE: اعداد جنی !!!!!!!!!!!
این وی بی هم مسخرش رو در آورده !
برید سراغ سی ++
وی بی به قول معروف بچه دلخوش کنکه
روش نمی شه حساب کرد
۱۴-اردیبهشت-۱۳۸۵, ۱۰:۴۲:۱۷
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
esmaeily-hosein آفلاین
كاربر دو ستاره
**

ارسال‌ها: 232
موضوع‌ها: 12
تاریخ عضویت: دى ۱۳۸۴

تشکرها : 6
( 91 تشکر در 46 ارسال )
ارسال: #11
RE: اعداد جنی !!!!!!!!!!!
به نظر من این عبارت را فکر میکنم از نوع رشته در نظر میگیرد .
چون دقیقا این عمل برای رشته نیز میتواند انجام شود .
راه حل :x=val(20000)+val(20000) میباشد همین .
علامت تقسیم : سبب میشود اعداد را به صورت رشته در نظر نگیرد .

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

در ضمن بیلی سلطان برنامه نویسی جهان میباشد هر برنامه نویس
وظیفه دارد به او احترام بگذارد.

اگر standard Programming را رعایت کنیم هیچ وقت این مشکلات پیش نمی آید.

هر چی روش خوبه توش خوب نیست!
(آخرین ویرایش در این ارسال: ۱۴-اردیبهشت-۱۳۸۵, ۱۱:۳۵:۱۵، توسط esmaeily-hosein.)
۱۴-اردیبهشت-۱۳۸۵, ۱۱:۳۲:۲۱
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  راهنمای در خصوص برنامه ی زیر...جمع اعداد vbir96 3 3,762 ۲۴-فروردین-۱۳۹۵, ۱۵:۵۰:۳۱
آخرین ارسال: Ghoghnus
Question ترتیب اعداد !!!! 1120 22 26,810 ۰۴-آذر-۱۳۹۳, ۰۳:۰۰:۴۶
آخرین ارسال: amirtm98
  [سوال] جدا کردن اعداد 11 رقمی arviiin 8 7,877 ۱۵-شهریور-۱۳۹۳, ۱۴:۴۱:۵۶
آخرین ارسال: arviiin
Question جمع اعداد میلیاردی mohsen0025 4 4,683 ۲۲-مرداد-۱۳۹۲, ۲۲:۲۳:۰۹
آخرین ارسال: mohsen0025
  تبدیل عدد ده دهی به اعداد باینری و هگزا و دسیمال jaber 4 21,326 ۰۶-دى-۱۳۹۱, ۱۴:۴۸:۰۶
آخرین ارسال: Ghoghnus
Rolleyes مشکل در تقسیم اعداد اعشاری (خیلی خیلی فوری arashkhan 5 11,657 ۰۴-شهریور-۱۳۸۹, ۱۱:۴۹:۵۱
آخرین ارسال: far_222000
  سوال در مورد اعداد تصادفی toytown 6 8,681 ۰۳-مرداد-۱۳۸۹, ۲۱:۱۸:۲۰
آخرین ارسال: dreamvbfox
  درخواست کد اعداد ترتیبی jaber 2 2,881 ۱۰-خرداد-۱۳۸۹, ۱۵:۵۷:۲۶
آخرین ارسال: jaber
  توليد اعداد تصادفي 4 رقمي بدون تكرار با ويژوال بيسيك 6 نارينا 1 8,195 ۰۴-آذر-۱۳۸۶, ۰۲:۵۹:۴۲
آخرین ارسال: Mamad2003
  نوشتن اعداد به فارسي seyyed 5 5,988 ۲۹-مهر-۱۳۸۵, ۱۸:۰۸:۱۸
آخرین ارسال: mr_vahid

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS