Problem ze sprawdzeniem pierwiastka z liczby

Odpowiedz Nowy wątek
2019-11-02 01:06
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

edytowany 4x, ostatnio: Patryk Figiel, 2019-11-02 01:10
co do zasady nie wrzuca się kodu w postaci obrazka, a już tym bardziej nie pakuje się N zrzutów ekranu w sytuacjach, gdzie wystarczyłby wycinek jednego - a jeszcze lepiej, postać tekstowa. - superdurszlak 2019-11-02 01:40

Pozostało 580 znaków

2019-11-02 01:44
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

Pozostało 580 znaków

2019-11-02 01:57
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ół.


Nie znam się, ale się wypowiem

Pozostało 580 znaków

2019-11-02 02:18
0

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

Pozostało 580 znaków

2019-11-02 06:21
sig
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)) 
Złożoność powinna być taka sama jak u mnie - policzenie pierwiastka. - lion137 2019-11-02 07:35

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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