Тема: Перевірка великого числа на квадрат
Проста задача: перевірити, чи є ціле число повним квадратом.
Наївне рішення:
def is_square(x):
return (x**.5).is_integer()
Виявлений баг: якщо число велике (більше значущих цифр, ніж обробляє float), то is_integer може дати true через округлення. Наприклад, is_square(10**100+1) дає True, хоча має дати False.
Гаразд, наївне рішення №2:
def is_square(x):
return int(x**.5)**2==x
Виявлений баг: якщо число по-справжньому велике (довжина більша, ніж обробляє float), то знову буде помилка, цього разу - виключна ситуація OverflowError. Наприклад, для is_square(10**1000) має бути True, а маємо помилку.
Правильне рішення: починаючи з Python 3.8, додано функцію math.isqrt, що обчислює цілу частину квадратного кореня саме як ціле число.
import math
def is_square(x):
return math.isqrt(x)**2==x