JavaRush /Kurslar /All lectures for UZ purposes /Haqiqiy sonlar bilan ishlashning nuances

Haqiqiy sonlar bilan ishlashning nuances

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Haqiqiy sonlarni yaxlitlash

Biz allaqachon muhokama qilganimizdek, int turidagi o'zgaruvchiga haqiqiy sonni tayinlaganda, u har doim pastga butun son sifatida yaxlitlanadi - uning kasr qismi shunchaki tashlanadi.

Biroq, oddiygina yaqin butun songa yoki umuman yuqoriga yaxlitlash kerak bo'lgan holatni osongina tasavvur qilish mumkin. Bu holatda nima qilish kerak?

Java'da va ko'plab o'xshash holatlar uchun Math sinf mavjud, unda round(), ceil(), floor() metodlari mavjud.


Math.round() metodi

Math.round() metodi sonni yaqin butun songa yaxlitlaydi:

long x = Math.round(haqiqiy_son)

Lekin, aytganlaridek, bir nuance bor: ushbu metodning natijasi - long butun son turidir (emas int). Haqiqiy sonlar juda katta bo'lishi mumkin, shuning uchun Java ishlab chiquvchilari Java'dagi eng katta butun son turini - longni ishlatishga qaror qilishdi.

Shuning uchun natijani int turidagi o'zgaruvchiga tayinlash uchun dasturchi aniq kompilyatorga ma'lumotlarning yo'qolishi mumkinligini bildirishi kerak (agar son int turiga sig'masa).

int x = (int) Math.round(haqiqiy_son)

Misollar:

Komanda Natija
int x = (int) Math.round(4.1);
4
int x = (int) Math.round(4.5);
5
int x = (int) Math.round(4.9);
5

Math.ceil() metodi

Math.ceil() metodi sonni butun songa yuqoriga yaxlitlaydi, misollar:

Komanda Natija
int x = (int) Math.ceil(4.1);
5
int x = (int) Math.ceil(4.5);
5
int x = (int) Math.ceil(4.9);
5

Math.floor() metodi

Math.floor() metodi sonni butun songa pastga yaxlitlaydi, misollar:

Komanda Natija
int x = (int) Math.floor(4.1);
4
int x = (int) Math.floor(4.5);
4
int x = (int) Math.floor(4.9);
4

Garchi, sonni butun songa pastga yaxlitlash uchun, oddiygina turini o'zgartirish operatoridan foydalanish (int) osonroq bo'ladi:

Komanda Natija
int x = (int) 4.9
4

Agar bu komandalarni eslab qolish qiyin bo'lsa, sizga kichik bir ingliz tili darsi yordam beradi:

  • Math — matematika
  • Round — doira/yaxlitlash
  • Ceiling — shift
  • Floor — pol


2. Haqiqiy sonlarning tuzilishi

double turi -1.7*10308 dan +1.7*10308 gacha bo'lgan qiymatlarni saqlashi mumkin. Bunday ulkan qiymatlar doirasi (int turiga nisbatan) shuni tushuntiradiki, double turi (xuddi float kabi) butun turlarga nisbatan butunlay boshqacha tuzilgan. Har bir double turidagi o'zgaruvchi ikki sonni o'z ichiga oladi: birinchisi mantissa, ikkinchisi esa — daraja.

Yuqorida keltirilgan misolda a va c teng bo'lmasligi kerak, lekin ular teng.

Yoki boshqa bir misolni olaylik:

Komanda Izoh
double a = 1.00000000000000001;
double b = 1.00000000000000002;
a o'zgaruvchisida 1.0 qiymati bo'ladi
b o'zgaruvchisida 1.0 qiymati bo'ladi

5. strictfp haqida qiziqarli fakt

Java'da boshqa dasturlash tillarida mavjud bo'lmagan maxsus strictfp (strict floating point) kalit so'z mavjud. Va bilasizmi, u nima uchun kerak? U haqiqiy sonlar bilan ishlashning aniqligini yomonlashtiradi. Uning paydo bo'lish tarixi taxminan quyidagicha:

Java yaratuvchilari:
Biz juda xohlaymizki, Java juda ommalashsin va Java dasturlari imkon qadar ko'proq qurilmalarda ishlasin. Shuning uchun biz Java mashinasining spetsifikatsiyasiga yozdik, barcha turdagi qurilmalarda barcha dasturlar bir xilda bajarilishi kerak!
Intel protsessori yaratuvchilari:
Bolalar, biz protsessorlarimizni yaxshiladik va endi barcha haqiqiy sonlar protsessor ichida 8 o'rniga 10 byte bilan ifodalanadi. Ko'proq byte — ko'proq raqamli raqamlar. Va bu nima deganini bilasizmi? To'g'ri: endi sizning ilmiy hisob-kitoblaringiz yanada aniqroq bo'ladi!
Olimlar va yuqori aniqlikdagi hisob-kitoblar bilan shug'ullanadiganlar:
Zo'r! Yaxshi ish. Ajoyib yangilik.
Java yaratuvchilari:
Yoq-yoq-yoq, bolalar. Biz aytdik-ku: barcha Java dasturlari barcha qurilmalarda bir xilda bajarilishi kerak. Intel protsessorlari ichida 10 byte haqiqiy sonlardan foydalanish imkoniyatini majburiy ravishda o'chiramiz.
Mana endi hammasi yana zo'r! Minnatdorchilik bildirmang ham.
Olimlar va yuqori aniqlikdagi hisob-kitoblar bilan shug'ullanadiganlar:
Sizlar umuman boshqacha bo'lib qoldingizmi? Tezda hammasini qanday bo'lsa shunday qilib qaytaring!
Java yaratuvchilari:
Bolalar, bu sizning foydangiz uchun! Faqat tasavvur qiling: barcha Java dasturlari barcha qurilmalarda bir xilda bajariladi. Ajoyib-ku!
Olimlar va yuqori aniqlikdagi hisob-kitoblar bilan shug'ullanadiganlar:
Yo'q. Umuman ajoyib emas. Tezda hammasini qaytaring! Yoki biz sizning Java'ni bilasiz qaerga tiqamiz!
Java yaratuvchilari:
Gm. Nega darhol aytmadingiz. Albatta qaytaramiz.
Zo'r protsessorlarning barcha xususiyatlaridan foydalanish imkoniyatini qaytarib berdik.
Aytganday. Biz maxsus strictfp so'zini tilga qo'shdik: agar uni funksiya nomi oldidan yozsangiz, ushbu funksiya ichidagi barcha haqiqiy sonlar bilan ishlash barcha qurilmalarda bir xilda yomon bo'ladi!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION