
نوشته شده توسط
Gold
واقعا جالب بود.
میشه بیشتر در مورده کدتون توضیح بدید؟
فقط یه مشکل داره...(البته جسارتا)
وقتی میزاریم رند بشه به سمت بالا. اگه گام رو بزاریم 10 و رند به سمت بالا باشه اگه عدد 10 رو وارد کنیم میشه 20.
در صورتی که میخواهیم بشه 10.
البته این موضوع در رند به سمت پایین درست کار میکنه.
ممنون از کمکتون.
سلام
در مورد مشکل، حق با شماست. البته مشکل فقط برای گام 10 نیست؛ در رند به سمت بالا، اگر عدد وارد شده به عدد گام ختم بشه (مثلاً 1120 با گام 20) باز هم این مشکل پیش میاد (تو این مثال میشه 1140).
برای رفع مشکل، به نظر من یه If قبل از خط آخر اشکال کار رو برطرف میکنه:
if T = N mod P then Jahat := Down;
توجه! قسمتهای آبی رنگ توضیحات ریاضیه و ربطی به برنامه نویسی نداره. اگه حوصله ندارین نخونین.
این کد تقریباً از روش قطع کردن، برای تقریب زدن استفاده میکنه.
روش قطع کردن به این صورت هست که شما به تعداد صفرهای سمت راست گام، ارقام سمت راست عدد مورد تقریب رو صفر میکنید (مثلاً 1340 با تقریب کمتر از 100 میشه 1300). این همون رند به سمت پایین مورد بحث تاپیک هست. و البته برای رند به سمت بالا، میشه قرارداد کرد که بعد از صفر کردن یک واحد به اولین رقم غیر صفر از سمت راست اضافه بشه (مثلاً برای 1340 با تقریب کمتر از 100، اول میشه 1300 بعد 3 رو با 1 جمع میکنیم و میشه 1400).
اما این روش برای توانهای صحیح 10 با همین قراردادها جواب میده، اما برای بقیهی اعداد (مثلاً 35) باید کمی دستکاری بشه. چون ممکنه عدد داده شده اصلاً به صفر ختم نشه (همون 35) بنابراین توی این کد
اول ـ تعداد ارقارم عدد گام رو حساب میکنیم؛ برای اینکار از خواص لگاریتم نپری (همون ln) استفاده کردم. با تقسیم ln هر عدد بر ln(10) و جمع قسمت صحیح خارج قسمت این تقسیم با 1، تعداد ارقام عدد به دست میاد. نمیدونم این روش جایی ثبت شده یا نه، ولی یه روش درسته. این روش رو، من با معکوس کردن روش محاسبهی توان بدست اوردم:
a^b = e^(b*ln(a))
البته از تابع Trunc هم برای حذف قسمت اعشاری عدد بدست اومده استفاده کردم.
دوم ـ برای صفر کردن سمت راست عدد مورد تقریب به تعداد ارقام مورد نیاز، ابتدا با همین فرمول بالا، 10 رو به توان تعداد ارقام عدد گام میبریم (مثلاً برای 35، میشه 10 به توان 2 یعنی 100). بعد عدد مورد تقریب رو به اون تقسیم و ضرب میکنیم (مثلاً 1340 تقسیم بر 100 و ضرب در 100 که مساوی 1300 هست: 1300 = 100 * 100 div 1340). و در آخر هم باقیموندهی تقسیم قبل رو بر گام تقسیم و ضرب میکنیم. منتها قبل از ضرب، اگه رند کردن به سمت بالا باشه، یه واحد به خارج قسمت تقسیم دوم اضافه میکنیم. اینکار رو با عبارت Byte(Jahat)+ انجام میدم (مثلا برای 1340، باقیموندهی تقسیم اول میشه 40 و بعد 40 تقسیم بر 35 میشه 1. حالا اگه رند به سمت بالا باشه 1+1 رو در 35 ضرب میکنیم و حاصل رو با 1300 جمع میکنیم).
موفق باشید.