Witam, mam do napisania program, który sprawdzi podane na wejściu liczby czy są kwadratami innej liczby. Nie rozumiem dlaczego dla niektórych z nich wyświetlany jest napis True albo False, jest to sprzeczne z moimi obliczeniami na kalkulatorze. Na przykład liczba z input'u ze screena: 4836, pierwiastka z niej nie możemy obliczyć, a mimo to program wyświetla 'True' czyli według niego można, dlaczego?
Proszę o pomoc
Wykonyujesz obliczenia na floatach, zawsze będzie niedokładnie (i Przepełnisz dla dużych liczb), porównanie tylko na integerach:
def is_perfect_square(n):
test = int(math.sqrt(n))
if n == test * test:
return True
else:
return False
-
Nawet jeśli
number
na wejściu jest typu całkowitego (int
) to wynikmath.sqrt
jest już zmiennoprzecinkowy (float
), więc Twoje sprawdzenie może nie zadziałać tak, jak byś oczekiwał - ten typ jest obarczony błędami zaokrągleń spowodowanymi tym, że reprezentacja takich liczb w komputerze ma skończoną dokładność, a co gorsza (z punktu widzenia istot posługujących się systemem dziesiętnym) jest w systemie dwójkowym i ma dość specyficzną postać. Może się okazać, że wynik działaniasqrt(9) * sqrt(9)
nie będzie wcale równy9
, tylko na przykład9.00000000000000003
-
Warunek jest trochę bez sensu. Mając na uwadze że
sqrt
i tak zwróci ułamek, to w przypadku gdyby te błędy nie występowały byłby po prostu zawsze prawdziwy. Ale możesz np. wykorzystaćmath.floor(x)
/math.ceil(x)
lub rzutowanieint(x)
by zaokrąglić pierwiastek do liczby całkowitej w górę lub w dół.
Tak przy okazji, Python interpretuje swój float
jako double
w języku C ;)
szybciej, aczkolwiek da się jeszcze przyśpieszyć
def issquare(liczba):
i = 2
while i * i < liczba:
i += 1
if i * i == liczba:
return True
return False
print(issquare(5))
print(issquare(4))
print(issquare(4836))