logarifm asosining qiymati hisoblanadi. Dastur iloji boricha katta M lar uchun ishlashi kerak.
Masalaning tahlili e ning qiymatini
Tayyor butun sonli katta arifmetika uzun masala yechishni juda kichiklashtirishi mumkin – unda
Talab qilinadigan aniqlik amalga oshirilgan (kengroq pastda) olingan natijani o‘nlik ulush
ko‘rinishida chiqarish qoladi, bu esa juda ham murakkab emas, haqiqatda: agar summa (4.4) ni
½! qo‘shiluvchidan boshlasa birdan kichik. Takidlaymiz: A/B kasirning verguldan keyingi
(o‘nliklar miqdori) bitta raqamning qiymati [10*A/B] ga teng, ikkinchi raqamning qiymati
(o‘nliklar va yuzliklar) [100*A/B] ga teng va shu kabilar. Shuning uchun verguldan keyingi M ta
belgini chiqarish uchun uzun kasirning suratini
ga ko‘paytirish va [10*A/B] ni chiqarish
mumkin. Bu raqamlarni bittadan ham olish mumkin: kasirni 10 ga M marta ko‘paytiramiz, butun
qismini navbatdagi o‘nlik raqam singari chiqaramiz. Ulush qismini esa keyingi ko‘paytirish
uchun ishlatamiz (4.1.3 bo‘limini qarang, ixtiyoriy hisoblash sistemasi ishlatilganida o‘nlik
chiqarish algoritmi).
Biroq agar uzun butun sonli bo‘lish bo‘lmasa (4.4) ning qisman summalarini taxminiy o‘nlik
kasr ko‘rinishida bevosita hisoblash juda qulaydir. Uzun o‘nlik kasrning quyidagicha talqin
qilinishini ishlatamiz: word elementlar massivi, hisoblash sistemasining asosi – 10000;
massivning birinchi elementi birinchi raqamga (ushbu asos bo‘yicha), ikkinchisi ikkinchi
raqamga va shu kabilarga ega bo‘ladi.
Bizning taqdim qilishda butun qisimini ulush qisimdan ajratib turuvchi vergul (nuqtalar hamma
vaqt massivning birinchi elementidan oldin joylashadi), ya’ni fiksotsiyalangan. Jumladan agar
son juda kichik nolga yaqin son bo‘lsa (masalan; 0,0000123), massivning boshlang‘ich
elementlarining qandaydir miqdori nol bilan to‘lgan bo‘ladi, ahamiyatga ega bo‘lgan raqamlar
keyingi elementlardan boshlanadi. Kasirlarni saqlashning bunday usuli fiksotsiyalangan nuqtali
tagdim qilish (fixed point) deyiladi.
Sonlarni mashinaviy “haqiqiy” tiplarda (real extended va shu kabilar) tagdim etish 1.23*10
9
ko‘rinishdagi matematik yozish bilan anologikdir, ya’ni mantissada darrov axamiyatga ega
raziryadlar keladi, tartib (ushbu razryadlarga nisbatan vergul qayerda joylashishini haqidagi
axborot) esa alohida saqlanadi. Shunday qilib, vergul katta ahamiyatga ega belgiga nisbatan
“suzadi” va bunday taqdim qilish suzuvchi nuqta deyiladi (floating point).
Odatda suzuvchi nuqtali kasrlar ishlatiladi, chunki ushbu usul uchun to‘lib ketishi va aniqlik
yo‘qotilishining xavfi ancha kichik. Biroq ushbu masalada arifmetik amallar ayniqsa qo‘shish
uchun fiksotsiyalangan nuqta qulay.
“Uzun kasr” tipidagi ikkita o‘zgaruvchini quvvatlab turamiz: curr – joriy n uchun qo‘shiluvchi
va sum-
qisman summaning joriy qiymati.
(4.4) ga binoan 1/(n-1)! dan 1/n! ga o‘tish uchun uzun kasrni (odatdagi) butun songa bo‘lish va
ikkita uzun kasrlarni qo‘shish kerak. Odatiy tiplarga buni curr:=curr/n va sum+curr kabi yozish
mumkin. Uzun kasrlar bilan boshqa arifmetik operatsiyalar kerak emas, yana inesializatsiyaning
dasturiy operatsiyasi bor sum va corr boshlang‘ich ½ qiymatni o‘zlashtirib olish kerak.
Uzun kasrni odatdagi butun songa bo‘lish va ulushlarni qo‘shish operatsiyalarni O(M)
murakkablik bilan amalga oshirish mumkin, bu yerda
M – uzun sondagi raqamlar miqdori.
Shartli xatarli moment bor – qo‘shiluvchilar soni emas, balki verguldan keyingi belgilar miqdori
berilgan. Verguldan keyin berilgan miqdori belgilarni olish uchun qancha qo‘shiluvchilarni olish
kerakligi noma’lum. Shunday qaror qabul qilamiz: talab qilinadigan 10
-M
aniqlikdan navbatdagi
qo‘shiluvchi kam bo‘lsa, to‘xtaymiz. (4.4) formula uchun to‘xtashning kretriysi to‘g‘ri deb
so‘zga ishonishga iltimos qilamiz, biroq umuman o‘xshash narsalarni tasdiqlash uchun jiddiy
matematik tahlil zarur. Chunki hamma 1+1/2+1/3+…+1/n+… qator mavjud, unda
qo‘shiluvchilar monoton ravishda nolga, summa esa – cheksizlikka intiladi.
Bizning uchun sonlarda verguldan keyin nechta belgini ta’minlash kerak? Shartda “verguldan
keyin o‘nlab belgilarning M miqdori” berilgan, shuning uchun birinchi qarashda 10000 asos
bo‘yicha [M/4] belgi yetarli. Biroq fiksotsiyalangan nuqtali tagdim qilishga yaxlitlash ishtirok
etadi. Demak, xatolik ham mavjud. Bundan ham yomoni, xatoliklar algoritmning ishlash
jarayonida to‘planib boradi (summa xatoligi “o‘ziga” qo‘shiluvchi xatoliklarini “tashlaydi”).
(4.4) formula bo‘yicha hisoblashda xatoliklar juda sekin to‘planadi. curr (1/6 dan boshlab) ning
barcha qiymatlari taxminiy hisoblanadilar, biroq o‘zimiz ushbu taxminning aniqligini tanlaymiz.
Verguldan keyingi
k belgilarning (10000 asosli sistemada) aniqligi tanlangan deylik.
curr ning
yangi qiymatini hisoblashda avvalgi (taxminiy) qiymat butun joriy n qiymatga bo‘linadi. Shu
tufayli, curr songa bo‘linmasin absolyut xatolik o‘smaydi va verguldan keyingi k - razryadda
birdan oshmaydi. Demak n ta qo‘shiluvchi qo‘shib n*10000
-k
dan katta bo‘lmagan absolyut
xatolikni olamiz.
Qanday n va M lar bilan ishlash mumkinligini aniqlashtiramiz. Agar DOS kompilyatorlari tomon
qo‘yiladigan massiv o‘lchami 64 Kb ga qo‘yilgan cheklovlardan kelib chiqsak biz
o‘nlik belgidan ko‘p olishga erisha olmaymiz. O‘nta mos keluvchi n qiymatni topish maqsada
131000*ln10 gacha yetguncha siklda
ni hisoblaymiz.
ekanligini
olamiz ya’ni uni taqdim qilish uchun word yoki integer ni ishlatish mumkin. Agarda katta aniqlik
(millionlab o‘nlik belgi) kerak bo‘lsa u holda (32-bitli kompilyatorga) n ni longintga tagdim
qilishga to‘g‘ri keladi va uzun kasrni songa bo‘lishni word tilida emas balki longint tilida yozish
kerak.
N ning bunday qiymatlarida barcha ichki hisoblashlarni natijani chiqarish kerak bo‘lgan
aniqlikdan 2 belgiga (1000 asosli sistema) aniqlikda amalga oshirish kerak. M/4 yaxlitlanish
bilan ovvora bo‘lmaslik uchun USED_CELLS:=(M div 4)+3 ni ishlatamiz.
curr qo‘shiluvchilar kattaligi doimo kamayadi va katta
n larda katta
curr raziryadlarining
sezilarli qismi 0 ga teng shuning uchun zarur bo‘lgan ishdan xoli bo‘lish uchun uzun kasrga
raqamlar massiv va USED_KELLS (yuqori aniqlikka qaralsin) indeksidan tashqari nolga teng
bo‘lmagan elementning kichik indeksi ham saqlaymiz.
Do'stlaringiz bilan baham: