Основи роботи з дійсними числами

Для запису констант або при введенні-виведенні може використовуватися звичайний запис десятково дробу, наприклад 123.456, так і “інженерний” запис числа, де мантиса записується у вигляді дійсного числа з однією цифрою до точки і деякою кількістю цифр після коми, потім слід буква ‘’ e ‘’ (або ‘’ E ‘’) і експонента. Число 123.456 в інженерному записі буде виглядати так , це означає, що 1.23456 потрібно помножити на 10 ** 2. І мантиса і експонента можуть бути негативними і записуються в десятковій системі.

Такий запис чисел може застосовуватися при створенні дійсних констант, а також при введенні і виведенні. Інженерний запис зручний для зберігання дуже великих або дуже маленьких чисел, щоб не брати до уваги кількість нулів на початку або кінці числа.

Mетод format

Якщо хочеться вивести число не в вигляді інженерного запису, а з фіксованою кількістю знаків після коми, то слід скористатися методом format, який має масу можливостей. Нам потрібен тільки вивід фіксованої кількості знаків, тому скористаємося готовим рецептом для виведення 25 знаків після десяткового дробу у числа 0.1:

x = 0.1
print('{0:.25f}'.format(x))

Виведення такої програми буде виглядати як 0.1000000000000000055511151, що ще раз підтверджує думку про те, що число 0.1 неможливо зберегти точно.

Проблеми дійсних чисел

Розглянемо простий приклад:

if 0.1 + 0.2 == 0.3:
    print('Yes')
else:
    print('No')

Якщо запустити цю програму, то можна легко переконатися в тому, що 0.1 + 0.2 не дорівнює 0.3. Хоча можна було сподіватися, що незважаючи на неточне уявлення, воно виявиться однаково неточним для всіх чисел.

Тому при використанні дійсних чисел потрібно дотримуватися кількох простих правил:

1) Якщо можна обійтися без використання дійсних чисел - потрібно це зробити. Дійсні числа проблемні, неточні і повільні.

2) Два двйсних числа рівні між собою, якщо вони відрізняються не більше ніж на epsilon. Число X менше числа Y, якщо

Код для порівняння двох чисел, заданих з точністю 6 знаків після коми, виглядає так:

x = float(input())
y = float(input())
epsilon = 5 * 10**-7
if abs(x - y) < 2 * epsilon:
    print('Equal')
else:
    print('Not equal')

У разі, якщо над числами відбувалися якісь дії, то значення epsilon потрібно обчислювати як в наведеному в першому прикладі. У навчальних завданнях це можна зробити не всередині програми, а один раз руками для гіршого випадку і застосовувати обчислене значення як константу.

×

Підписатися

Останні задачі надсилаються прямо в папку "Вхідні".