Goda matematik funksiyalar
Qo‘shish, ayirish, ko‘paytirish va bo‘lish kabi oddiy matematik amallarni Go operatorlari bilan bajarish mumkin.
Masalan:
Lekin kvadrat ildiz topish, sonni darajaga oshirish, sinus yoki kosinus hisoblash, sonlarni yaxlitlash kabi murakkabroq hisob-kitoblar uchun tayyor funksiyalar kerak bo‘ladi.
Go standart kutubxonasida bunday funksiyalar math paketida joylashgan.
Bu qismda:
mathpaketini dasturga qo‘shishni;- matematik o‘zgarmas qiymatlardan foydalanishni;
- ildiz va daraja hisoblashni;
- sonlarni yaxlitlashni;
- trigonometrik funksiyalarni;
- logarifm va eksponentani;
NaNva cheksiz qiymatlarni
ko‘rib chiqamiz.
math paketini import qilish
math paketidagi funksiyalar va o‘zgarmas qiymatlardan foydalanish uchun avval paketni import qilish kerak.
Masalan:
Natija:
Bu yerda math.Pi π sonining Go standart kutubxonasida tayyor berilgan qiymatidir.
Muhim jihat shundaki, Pi funksiya emas. U o‘zgarmas qiymat.
Shuning uchun:
deb yoziladi.
Qavs kerak emas.
Bunga qarama-qarshi ravishda math.Sqrt() yoki fmt.Println() funksiyalardir:
Funksiyaga argument uzatish uchun qavs ishlatiladi.
Birinchi misoldagi fmt.Println() math.Pi qiymatini odatiy ko‘rinishda chiqaradi:
Agar natijada verguldan keyin faqat ikki xona ko‘rsatish kerak bo‘lsa, fmt.Printf() va %.2f formatidan foydalanish mumkin:
| main.go | |
|---|---|
Natija:
Bu yerda:
float turidagi sonni verguldan keyin ikki xona bilan chiqarishni bildiradi.
Masalan:
%.2f— ikki xona;%.3f— uch xona;%.4f— to‘rt xona.
Muhim farq bor: formatlash faqat ekranda ko‘rinadigan natijani o‘zgartiradi.
math.Pining o‘z qiymati o‘zgarmaydi.
Masalan, math.Pi ichida hali ham taxminan:
qiymati saqlanadi. Biz faqat uni 3.14 ko‘rinishida chiqaryapmiz.
Tip
Agar bir nechta paket kerak bo‘lsa, ularni alohida import bilan yozish mumkin. Lekin Go kodida odatda bitta import blokidan foydalaniladi:
Ko‘p ishlatiladigan matematik funksiyalar
math paketidagi funksiyalarning katta qismi float64 qiymatlar bilan ishlaydi.
Ko‘p hollarda funksiya:
float64argument qabul qiladi;- hisob-kitob bajaradi;
float64qiymat qaytaradi.
Quyidagi jadvalda eng ko‘p ishlatiladigan funksiyalar keltirilgan:
| Funksiya yoki o‘zgarmas | Vazifasi |
|---|---|
math.Abs(x) |
xning modulini, ya’ni manfiy bo‘lmagan qiymatini qaytaradi |
math.Sqrt(x) |
xning kvadrat ildizini hisoblaydi |
math.Cbrt(x) |
xning kub ildizini hisoblaydi |
math.Pow(x, y) |
xni y-darajaga oshiradi |
math.Pow10(n) |
10 ning n-darajasini hisoblaydi |
math.Min(x, y) |
ikki sondan kichigini qaytaradi |
math.Max(x, y) |
ikki sondan kattasini qaytaradi |
math.Mod(x, y) |
kasrli sonlar uchun bo‘lish qoldig‘ini hisoblaydi |
math.Floor(x) |
eng yaqin kichik butun qiymat tomon yaxlitlaydi |
math.Ceil(x) |
eng yaqin katta butun qiymat tomon yaxlitlaydi |
math.Round(x) |
eng yaqin butun qiymatga yaxlitlaydi |
math.Sin(x) |
radian bilan berilgan xning sinusini hisoblaydi |
math.Cos(x) |
radian bilan berilgan xning kosinusini hisoblaydi |
math.Tan(x) |
radian bilan berilgan xning tangensini hisoblaydi |
math.Asin(x) |
xning arksinusini radianlarda qaytaradi |
math.Acos(x) |
xning arkkosinusini radianlarda qaytaradi |
math.Atan(x) |
xning arktangensini radianlarda qaytaradi |
math.Exp(x) |
e sonini x-darajaga oshiradi |
math.Log(x) |
xning natural logarifmini hisoblaydi |
math.Log10(x) |
xning 10 asosli logarifmini hisoblaydi |
math.Hypot(x, y) |
katetlari x va y bo‘lgan uchburchak gipotenuzasini hisoblaydi |
math.Pi |
π matematik o‘zgarmas qiymati |
math.E |
e matematik o‘zgarmas qiymati |
Keyingi bo‘limlarda bu funksiyalarning muhimlarini alohida misollar bilan ko‘rib chiqamiz.
Modul, ildiz va daraja
Modul sonning ishorasini hisobga olmasdan uning kattaligini bildiradi.
Masalan:
Go’da modulni math.Abs() bilan hisoblash mumkin.
Kvadrat ildiz uchun math.Sqrt(), kub ildiz uchun math.Cbrt() ishlatiladi.
Darajaga oshirish uchun esa math.Pow() mavjud.
Natija:
Modul: 12.5
81 ning kvadrat ildizi: 9
27 ning kub ildizi: 3
2 ning 5-darajasi: 32
10 ning 3-darajasi: 1000
Endi har bir hisobni alohida ko‘ramiz.
natijasi:
bo‘ladi. Chunki modul manfiy ishorani olib tashlaydi.
81ning kvadrat ildizini hisoblaydi:
Shuning uchun natija 9.
esa kub ildizni topadi:
Natija 3.
math.Pow() ikki argument qabul qiladi:
Bu yerda:
2— asos;5— daraja.
Hisob:
bo‘ladi.
math.Pow()ning ikkala argumenti ham hisoblash vaqtida float64 sifatida ishlatiladi va natija ham float64 bo‘ladi.
math.Pow10(3) esa maxsus holat uchun mo‘ljallangan:
Ya’ni faqat 10 ning darajasini hisoblash kerak bo‘lsa, math.Pow10() qulayroq.
Aylana yuzini hisoblash
Aylananing yuzi quyidagi formula bilan topiladi:
Bu yerda:
S— aylana yuzi;π— pi soni;r— radius.
Radiusni foydalanuvchidan olib, math.Pi va math.Pow() yordamida aylana yuzini hisoblaymiz:
| main.go | |
|---|---|
Bu dastur bosqichma-bosqich quyidagicha ishlaydi.
Avval radius nomli float64 o‘zgaruvchi yaratiladi:
Keyin foydalanuvchi kiritgan qiymat o‘qiladi:
Masalan, foydalanuvchi 5 kiritsa:
bo‘ladi.
Keyin:
quyidagini hisoblaydi:
So‘ng:
hisoblanadi.
Taxminan:
Natija %.2f bilan chiqarilgani uchun ekranda:
ko‘rinadi.
To‘liq natija:
Radiusning kvadratini math.Pow() ishlatmasdan ham hisoblash mumkin:
Masalan:
Aynan kvadrat hisoblashda bu usul sodda va tushunarli.
math.Pow() esa daraja oldindan aniq bo‘lmaganda yoki ixtiyoriy daraja bilan ishlaganda ayniqsa foydali.
Gipotenuzani hisoblash
Pifagor teoremasiga ko‘ra, to‘g‘ri burchakli uchburchakning gipotenuzasi quyidagi formula bilan hisoblanadi:
Bu yerda a va b — katetlar.
Masalan, a = 3 va b = 4 bo‘lsa:
Go’da bu hisobni ikki xil usul bilan bajarish mumkin:
| main.go | |
|---|---|
Natija:
Birinchi usul formulani bevosita yozadi:
Bu yerda:
Ikkinchi usul:
aynan shu vazifa uchun tayyorlangan.
Oddiy qiymatlarda ikkala usul ham bir xil natija beradi.
Lekin math.Hypot() juda katta yoki juda kichik sonlar bilan ishlaganda hisoblashni sonli jihatdan barqarorroq bajaradi. Oddiy a*a + b*b hisobida ayrim ekstremal qiymatlarda float64 chegaralari bilan bog‘liq muammolar yuzaga kelishi mumkin.
Shuning uchun gipotenuza yoki ikki koordinata orasidagi masofa kabi hisoblarda math.Hypot() qulay.
Sonlarni yaxlitlash
Kasrli sonlarni butun qiymatlarga yaqinlashtirish uchun math paketida bir nechta funksiya mavjud.
Eng ko‘p ishlatiladiganlari:
math.Floor();math.Ceil();math.Round().
Ular o‘xshash ko‘rinsa ham, bir xil ishlamaydi.
| main.go | |
|---|---|
Natija:
Har bir funksiyani alohida ko‘ramiz.
sondan kichik yoki unga teng bo‘lgan eng yaqin butun qiymatni qaytaradi.
Shuning uchun:
math.Ceil() esa yuqori tomonga ishlaydi:
natija:
math.Round() eng yaqin butun qiymatni tanlaydi:
3.7 soni 4ga 3dan yaqinroq. Shu sababli natija:
bo‘ladi.
Bu funksiyalar float64 qiymat qaytaradi.
Masalan:
Natija taxminan:
ko‘rinishida bo‘ladi.
Ekranda 3 deb ko‘rinsada, o‘zgaruvchining turi int emas.
U hali ham:
turida.
Manfiy sonlarda Floor va Ceil natijalariga alohida e’tibor berish kerak.
Masalan:
natijasi:
bo‘ladi.
Birinchi qarashda -3 bo‘lishi kerakdek ko‘rinishi mumkin. Lekin Floor doim son o‘qida kichik tomonga harakat qiladi.
Son o‘qida:
Shuning uchun kichik butun son -4.
Aksincha:
natijasi:
bo‘ladi.
Ma’lum kasr xonasigacha yaxlitlash
Ba’zan sonni butun songacha emas, masalan ikki kasr xonasigacha matematik yaxlitlash kerak bo‘ladi.
Misol:
qiymatini:
ko‘rinishiga keltirmoqchimiz.
Buning uchun qiymatni avval 100ga ko‘paytirish, keyin yaxlitlash va so‘ng yana 100ga bo‘lish mumkin.
| main.go | |
|---|---|
Natija:
Hisobni bosqichma-bosqich ko‘ramiz.
Boshlang‘ich qiymat:
Avval 100ga ko‘paytiriladi:
Keyin:
natija:
bo‘ladi.
So‘ng yana 100ga bo‘linadi:
Natijada qiymatning o‘zi ikki kasr xonasigacha matematik yaxlitlanadi.
Bu usulni:
bilan aralashtirmaslik kerak.
fmt.Printf("%.2f", son) faqat ekranga chiqariladigan ko‘rinishni ikki xonaga formatlaydi.
math.Round() yordamidagi usul esa keyingi hisoblarda ishlatiladigan qiymatni ham yaxlitlashga harakat qiladi.
Warning
float64 barcha o‘nli kasrlarni xotirada mutlaqo aniq saqlay olmaydi.
Masalan, `0.1`, `0.2` kabi ayrim sonlarning ikkilik ko‘rinishi cheksiz davom etadi. Shu sababli kompyuter ularni eng yaqin `float64` qiymat bilan saqlaydi.
Moliyaviy hisob-kitoblarda oddiy `float64` va `math.Round()` har doim yetarli bo‘lmasligi mumkin.
Pul qiymatlari bilan ishlaganda ko‘pincha pulni eng kichik birlikda butun son sifatida saqlash qulayroq.
Masalan, `125.50` so‘m o‘rniga eng kichik birlik asosida butun son saqlanishi mumkin.
Murakkab moliyaviy tizimlarda maxsus **decimal** turlar yoki kutubxonalar ham qo‘llanadi.
Eng kichik va eng katta qiymat
Ikki float64 qiymatdan kichigini topish uchun math.Min(), kattasini topish uchun math.Max() ishlatiladi.
| main.go | |
|---|---|
Natija:
Bu yerda:
ikkala sonni taqqoslab:
qiymatini qaytaradi.
esa:
qiymatini qaytaradi.
Bu funksiyalar, masalan, qiymatni ma’lum chegaradan oshirmaslik yoki ikkita o‘lchamdan kattasini tanlash kabi vazifalarda foydali.
Info
math.Min() va math.Max() float64 qiymatlar bilan ishlaydi.
Oddiy `int` qiymatlar bilan ishlaganda zamonaviy Go versiyalarida tilning ichki `min()` va `max()` funksiyalaridan foydalanish mumkin.
Masalan:
```go
kichik := min(10, 20)
katta := max(10, 20)
```
Bu holda `int` qiymatlarni `float64`ga aylantirish shart emas.
Daraja va radian
Trigonometriyada burchakni o‘lchashning bir nechta usuli mavjud.
Kundalik matematikada ko‘pincha daraja ishlatiladi:
Lekin Go’dagi:
funksiyalari burchakni darajada emas, radianda qabul qiladi.
Shuning uchun darajani avval radianga aylantirish kerak.
Formula:
Masalan, 30° uchun:
Hisob qisqartirilsa:
bo‘ladi.
Go’da:
| main.go | |
|---|---|
Natija:
Koddagi muhim qator:
Bu 30° qiymatini radian ko‘rinishiga o‘tkazadi.
Keyin:
va:
to‘g‘ri qiymatlarni hisoblaydi.
Warning
Quyidagi kod:
```go
math.Sin(30)
```
`30°`ning sinusini hisoblamaydi.
Bu yerda `30` qiymati **30 radian** deb qabul qilinadi.
Shu sabab trigonometrik hisoblarda daraja va radianni aralashtirib yuborish keng tarqalgan xatolardan biridir.
Teskari trigonometrik funksiyalar
Oddiy trigonometrik funksiyalar burchakdan trigonometrik qiymatni topadi.
Masalan:
Teskari trigonometrik funksiyalar esa buning teskarisini bajaradi.
Agar:
bo‘lsa, x burchagini topish uchun math.Asin() ishlatiladi.
math.Asin() va math.Acos() uchun argument odatda:
oralig‘ida bo‘lishi kerak.
Natija radianlarda qaytadi.
Agar natijani darajada olish kerak bo‘lsa, quyidagi formula ishlatiladi:
Misol:
| main.go | |
|---|---|
Natija:
Kod bosqichma-bosqich quyidagicha ishlaydi.
Avval:
hisoblanadi.
Natija taxminan:
radian bo‘ladi.
Keyin:
yordamida darajaga o‘tkaziladi.
Natija:
bo‘ladi.
Warning
math.Asin() va math.Acos() uchun haqiqiy sonlar doirasidagi argument -1 dan 1 gacha bo‘lishi kerak.
Masalan:
```go
math.Asin(2.5)
```
yoki:
```go
math.Acos(2.5)
```
haqiqiy son sifatida aniqlangan natijaga ega emas.
Bunday holatda Go `NaN` qiymatini qaytaradi.
Info
NaN — Not a Number, ya’ni “son emas” degan maxsus float64 qiymat.
Bu qiymat noto‘g‘ri yoki haqiqiy sonlarda aniqlanmagan matematik amal natijasini ifodalash uchun ishlatiladi.
Logarifm va eksponenta
math.Exp(x) va math.Log(x) bir-biriga teskari matematik amallardir.
math.Exp(x):
qiymatini hisoblaydi.
Bu yerda e — taxminan:
ga teng matematik o‘zgarmas.
math.Log(x) esa natural logarifmni hisoblaydi.
Misol:
| main.go | |
|---|---|
Natija:
Avval:
hisoblanadi:
Natija eDaraja o‘zgaruvchisiga yoziladi.
Keyin:
hisoblanadi.
Log va Exp teskari amallar bo‘lgani uchun natija yana taxminan:
bo‘ladi.
math.Log10() esa 10 asosli logarifmni hisoblaydi:
chunki:
natija:
bo‘ladi.
math.Log(x) uchun argumentning musbat bo‘lishi muhim.
Masalan:
manfiy cheksizlikni qaytaradi.
Manfiy sonning haqiqiy sonlar doirasidagi natural logarifmi mavjud emas.
Shuning uchun:
kabi hisob NaN qaytaradi.
NaN va cheksizlik
Ayrim matematik amallar haqiqiy sonlar to‘plamida natijaga ega emas.
Masalan:
haqiqiy son emas.
Go’da:
bajarilganda dastur darhol to‘xtab qolmaydi.
Buning o‘rniga math paketi maxsus NaN qiymatini qaytaradi.
| main.go | |
|---|---|
Natija:
Bu yerda:
qiymat NaN ekanini tekshiradi.
Natija NaN bo‘lgani uchun funksiya:
qaytaradi.
NaNni oddiy tenglik bilan tekshirish to‘g‘ri yondashuv emas. Buning uchun aynan math.IsNaN() ishlatiladi.
Cheksiz qiymatlarni tekshirish uchun esa:
mavjud.
Masalan, matematik hisob natijasi musbat yoki manfiy cheksizlik bo‘lishi mumkin.
Amaliy dasturlarda funksiyaga beriladigan argument ruxsat etilgan oraliqda ekanini hisoblashdan oldin tekshirish ko‘pincha yaxshiroq.
Masalan, kvadrat ildiz faqat manfiy bo‘lmagan qiymatlar uchun kerak bo‘lsa:
if x < 0 {
fmt.Println("Manfiy sondan haqiqiy kvadrat ildiz olib bo‘lmaydi")
return
}
natija := math.Sqrt(x)
Bu yondashuv noto‘g‘ri natijani keyingi hisob-kitoblarga uzatib yuborishning oldini oladi.
Funksiyalarni bir dasturda ko‘rish
Quyidagi misolda yuqorida ko‘rib chiqilgan asosiy math funksiyalarining ko‘pchiligi bitta dasturda jamlangan:
Natija:
math.Abs(-2.5) = 2.5
math.Sin(2.5) = 0.5985
math.Cos(2.5) = -0.8011
math.Tan(2.5) = -0.7470
math.Asin(0.5) = 0.5236
math.Acos(0.5) = 1.0472
math.Atan(2.5) = 1.1903
math.Exp(2.5) = 12.1825
math.Log(2.5) = 0.9163
math.Pow(2.5, 3) = 15.6250
math.Pow10(3) = 1000.0000
math.Sqrt(2.5) = 1.5811
math.Floor(2.5) = 2.0000
math.Ceil(2.5) = 3.0000
math.Round(2.5) = 3.0000
math.Pi = 3.1416
math.E = 2.7183
math.Min(2.5, 3) = 2.5000
math.Max(2.5, 3) = 3.0000
math.Mod(2.5, 3) = 2.5000
Bu yerda x:
ko‘pchilik oddiy matematik funksiyalar uchun ishlatiladi.
y:
math.Pow(), math.Min(), math.Max() va math.Mod() kabi ikkita argument talab qiladigan funksiyalarda ishlatiladi.
Teskari trigonometrik funksiyalarda esa alohida:
tanlangan.
Sababi math.Asin() va math.Acos() uchun qiymat -1 va 1 oralig‘ida bo‘lishi kerak.
Masalan:
to‘g‘ri argument.
Natija radianlarda:
atrofida chiqadi.
math.Mod(x, y) esa bo‘lish qoldig‘ini hisoblaydi.
Bu misolda:
hisoblanmoqda.
2.5 soni 3dan kichik bo‘lgani sababli 3 unga bir marta ham to‘liq sig‘maydi. Shu sabab qoldiq:
bo‘ladi.
Natijalardagi ko‘pchilik sonlar:
bilan formatlangan.
Shu sabab ular verguldan keyin to‘rt xona bilan ko‘rsatilgan.
Keyingi qism Goda if, else if va else shartlari haqida.
Misollar
Quyidagi misollarda oddiy arifmetik operatorlar va math paketidagi funksiyalar amaliy vazifalarda qanday ishlatilishini ko‘ramiz.
1. To‘g‘ri to‘rtburchak yuzi va perimetri
Bu misolda to‘g‘ri to‘rtburchakning yuzi va perimetri hisoblanadi.
Yuza formulasi:
Perimetr formulasi:
Kod:
package main
import "fmt"
func main() {
eni, boyi := 8.0, 5.0
fmt.Println("Yuza:", eni*boyi)
fmt.Println("Perimetr:", 2*(eni+boyi))
}
Hisobni bosqichma-bosqich ko‘ramiz.
Yuza:
Perimetr:
Natija:
Bu misolda maxsus math funksiyasi kerak emas. Oddiy ko‘paytirish va qo‘shish operatorlari yetarli.
2. Aylana uzunligi va yuzi
Bu misolda radius orqali aylananing uzunligi va yuzi hisoblanadi.
Aylana uzunligi:
Aylana yuzi:
Kod:
package main
import (
"fmt"
"math"
)
func main() {
radius := 3.0
fmt.Printf("Uzunlik: %.2f\n", 2*math.Pi*radius)
fmt.Printf("Yuza: %.2f\n", math.Pi*radius*radius)
}
Bu yerda radius:
ga teng.
Aylana uzunligi taxminan:
Aylana yuzi esa:
bo‘ladi.
math.Pi π sonining Go standart kutubxonasidagi tayyor qiymatini beradi. Uni qo‘lda 3.14 deb yozishdan ko‘ra math.Pidan foydalanish aniqroq.
3. Uchta sonning o‘rtacha qiymati
Arifmetik o‘rtacha qiymat barcha sonlarni qo‘shib, ularning soniga bo‘lish orqali topiladi.
package main
import "fmt"
func main() {
a, b, c := 7.0, 8.0, 10.0
ortacha := (a + b + c) / 3
fmt.Printf("%.2f\n", ortacha)
}
Hisob:
fmt.Printf("%.2f", ...) natijani ikki kasr xonasigacha ko‘rsatadi:
a, b va c qiymatlari float64 bo‘lgani sababli bo‘lish kasr qismini yo‘qotmaydi.
Agar hisob butun sonlar bilan bajarilganda, butun sonli bo‘lish qoidalariga e’tibor berish kerak bo‘lardi.
4. Foizni hisoblash
Bu misolda mahsulot narxiga chegirma qo‘llanadi.
package main
import "fmt"
func main() {
narx := 240_000.0
chegirmaFoizi := 15.0
chegirma := narx * chegirmaFoizi / 100
fmt.Println("Yangi narx:", narx-chegirma)
}
Avval 240 000ning 15%i hisoblanadi:
Demak, chegirma:
Keyin boshlang‘ich narxdan chegirma ayriladi:
Natija:
Bu formulani foiz, soliq, komissiya va boshqa nisbiy hisob-kitoblarda ishlatish mumkin.
5. Haroratni aylantirish
Selsiy bo‘yicha haroratni Farengeytga o‘tkazish formulasi:
Kod:
package main
import "fmt"
func main() {
celsius := 25.0
fahrenheit := celsius*9/5 + 32
fmt.Printf("%.1f °F\n", fahrenheit)
}
Hisob:
Natija:
Bu yerda celsius qiymati 25.0 deb yozilgan.
Shuning uchun u float64.
Natijada ifodadagi hisoblar ham suzuvchi nuqtali sonlar bilan bajariladi va kasr qismi kerak bo‘lsa saqlanadi.
6. Ikki nuqta orasidagi masofa
Koordinata tekisligida ikki nuqta orasidagi masofa quyidagi formula bilan hisoblanadi:
math.Hypot() aynan:
hisobini bajaradi.
Shuning uchun koordinatalar farqini unga uzatish mumkin:
package main
import (
"fmt"
"math"
)
func main() {
x1, y1 := 1.0, 2.0
x2, y2 := 4.0, 6.0
masofa := math.Hypot(x2-x1, y2-y1)
fmt.Println(masofa)
}
Avval koordinatalar orasidagi farq topiladi:
Keyin:
hisoblanadi:
Natija:
Bu Pifagor teoremasining koordinatalarga qo‘llangan ko‘rinishidir.
7. Yuqoriga qarab bo‘lish
Ba’zan elementlarni ma’lum sig‘imdagi guruhlarga ajratish kerak bo‘ladi.
Masalan:
23ta mahsulot bor;- har bir qutiga
5ta mahsulot sig‘adi.
Oddiy butun sonli bo‘lish:
natija beradi.
Lekin 4 ta qutiga faqat:
mahsulot sig‘adi.
Yana 3 ta mahsulot qoladi.
Demak, aslida 5 ta quti kerak.
Quyidagi formula butun sonli bo‘lishni yuqoriga yaxlitlashning keng tarqalgan usuli:
package main
import "fmt"
func main() {
mahsulot, qutiSigimi := 23, 5
qutilar := (mahsulot + qutiSigimi - 1) / qutiSigimi
fmt.Println(qutilar)
}
Hisob:
Butun sonli bo‘lishda kasr qismi tashlab yuboriladi.
Shuning uchun natija:
bo‘ladi.
Bu formula musbat butun sonlar uchun foydali:
Bu yerda:
n— elementlar soni;d— bitta guruh sig‘imi.
8. Sonni ma’lum oraliqda saqlash
Ba’zan qiymat ma’lum pastki va yuqori chegaradan chiqmasligi kerak.
Masalan, foiz:
dan kichik va:
dan katta bo‘lmasligi kerak.
Lekin dasturga:
qiymati kelgan deb tasavvur qilamiz.
Uni 0..100 oralig‘ida saqlash uchun math.Min() va math.Max()ni birga ishlatish mumkin:
package main
import (
"fmt"
"math"
)
func main() {
foiz := 135.0
foiz = math.Max(0, math.Min(foiz, 100))
fmt.Println(foiz)
}
Hisob ichkaridan tashqariga bajariladi.
Avval:
hisoblanadi.
Natija:
Chunki 100 kichikroq.
Keyin:
hisoblanadi.
Natija yana:
bo‘ladi.
Shunday qilib:
ga cheklanadi.
Agar qiymat -20 bo‘lganida:
bo‘lardi.
Demak:
Bu usul qiymatni ma’lum interval ichida ushlab turish uchun ishlatiladi.
9. Suzuvchi nuqtali sonlarni taqqoslash
float64 qiymatlarni bevosita == bilan taqqoslash har doim ham kutilgan natijani bermasligi mumkin.
Sababi ko‘pgina o‘nli kasrlar ikkilik sanoq tizimida aniq ifodalanmaydi.
Shu sabab son xotirada juda kichik xato bilan saqlanishi mumkin.
Ikki qiymat orasidagi farq juda kichik bo‘lsa, ularni amaliy jihatdan teng deb hisoblash mumkin.
package main
import (
"fmt"
"math"
)
func main() {
a := 0.1 + 0.2
b := 0.3
teng := math.Abs(a-b) < 1e-9
fmt.Println(teng)
}
Bu yerda:
ikki qiymat orasidagi farqni hisoblaydi.
Farq manfiy chiqishi ham mumkin. Shuning uchun:
orqali uning moduli olinadi.
Keyin:
bilan juda kichik ruxsat etilgan chegaradan kichikligi tekshiriladi.
1e-9 ilmiy yozuvda:
degani.
Agar farq bundan kichik bo‘lsa:
bo‘ladi.
Bu usul epsilon bilan taqqoslash deb ataladigan yondashuvga misol.
Amaliy dasturda epsilon qiymatini tanlash hisobning masshtabi va talab qilinadigan aniqlikka bog‘liq.
10. Murakkab foiz
Murakkab foizda har bir yangi davrdagi foiz faqat boshlang‘ich summaga emas, oldingi davrlarda yig‘ilgan foizga ham qo‘shiladi.
Soddalashtirilgan formula:
Bu yerda:
P— boshlang‘ich summa;r— bir davrdagi foiz;n— davrlar soni;A— yakuniy summa.
Go’da darajani math.Pow() bilan hisoblash mumkin:
package main
import (
"fmt"
"math"
)
func main() {
boshlangich := 1_000_000.0
yillikFoiz := 12.0
yil := 3.0
natija := boshlangich * math.Pow(1+yillikFoiz/100, yil)
fmt.Printf("%.2f\n", natija)
}
Avval foiz kasr ko‘rinishiga o‘tkaziladi:
Keyin:
bo‘ladi.
Uch yil uchun:
hisoblanadi.
Bosqichma-bosqich:
Keyin boshlang‘ich summa ko‘paytiriladi:
Natija:
bo‘ladi.
Bu yerda math.Pow() har bir yil uchun bir xil ko‘paytirishni qo‘lda takrorlamasdan, daraja orqali hisoblash imkonini beradi.