Problem ze sprawdzeniem pierwiastka z liczby

0

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
screenshot-20191102010830.png

screenshot-20191102010903.png

0

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
0
  1. Nawet jeśli number na wejściu jest typu całkowitego (int) to wynik math.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łania sqrt(9) * sqrt(9) nie będzie wcale równy 9, tylko na przykład 9.00000000000000003

  2. 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 rzutowanie int(x) by zaokrąglić pierwiastek do liczby całkowitej w górę lub w dół.

0

Tak przy okazji, Python interpretuje swój float jako double w języku C ;)

1

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)) 

1 użytkowników online, w tym zalogowanych: 0, gości: 1