Próbuję znaleźć największy pierwiastek kostki, który jest liczbą całkowitą, czyli mniej niż 12 000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
Nie jestem jednak pewien, jak sprawdzić, czy jest to liczba całkowita, czy nie! Mógłbym przekonwertować go na ciąg, a następnie użyć indeksowania, aby sprawdzić wartości końcowe i sprawdzić, czy są one zerowe, czy nie, co wydaje się dość kłopotliwe. Czy istnieje prostszy sposób?
python
floating-point
chopper draw lion4
źródło
źródło
Odpowiedzi:
Aby sprawdzić, czy liczba zmiennoprzecinkowa jest liczbą całkowitą, użyj
float.is_integer()
metody :Metodę dodano do
float
typu w Pythonie 2.6.Weź pod uwagę, że w Pythonie 2
1/3
jest0
(dzielenie podłogi dla argumentów całkowitych!), A arytmetyka zmiennoprzecinkowa może być nieprecyzyjna (afloat
jest przybliżeniem przy użyciu ułamków binarnych, a nie dokładną liczbą rzeczywistą). Ale nieznaczne dostosowanie pętli daje:co oznacza, że cokolwiek powyżej 3 kostek (w tym 10648) zostało pominięte z powodu wyżej wspomnianej niedokładności:
Zamiast tego musisz sprawdzić liczby zbliżone do całego numeru lub nie użyć go
float()
do znalezienia swojego numeru. Jak zaokrąglenie w dół pierwiastka z12000
:Jeśli używasz języka Python 3.5 lub nowszego, możesz użyć tej
math.isclose()
funkcji, aby sprawdzić, czy wartość zmiennoprzecinkowa mieści się w konfigurowalnym marginesie:W starszych wersjach naiwna implementacja tej funkcji (pomijanie sprawdzania błędów i ignorowanie nieskończoności i NaN), jak wspomniano w PEP485 :
źródło
True
wtedy, gdy nie ma żadnych miejsc po przecinku. Oczywiście może wystąpić nieporozumienie dotyczące arytmetyki zmiennoprzecinkowej i precyzji.1.0000000000000001
jest wyświetlany jako1.0
, w 3 pokazano najkrótszą reprezentację ciągu, która daje tę samą wartość.range(12000, -1, -1)
może być (imo, bardziej czysto) przepisany jakoreversed(range(12000+1))
Możemy użyć operatora modulo (%). To pokazuje nam, ile mamy resztek, gdy podzielimy x przez y - wyraża się jako
x % y
. Każda liczba całkowita musi się dzielić przez 1, więc jeśli pozostała liczba nie może być liczbą całkowitą.Ta funkcja zwróci wartość logiczną
True
lubFalse
, w zależności od tego, czyn
jest liczbą całkowitą.źródło
Możesz użyć tego:
źródło
.is_integer()
nadal działa.is_integer
używa podobnej metody (o = (floor(x) == x) ? Py_True : Py_False;
). Ale zgadzam się, że należy używać,is_integer()
ponieważ jest to o wiele wyraźniejsze.large_float == large_int
Może zawieść, nawet jeślilarge_float == float(large_int)
.123456789012345678901234567890.0 != 123456789012345678901234567890
ale123456789012345678901234567890.0 == float(123456789012345678901234567890)
k = 123456789012345678901234567890.0
wtedyk == int(k)
jest Prawda, która jest poprawną odpowiedzią.Nie musisz niczego zapętlać ani sprawdzać. Wystarczy wziąć pierwiastek kostki z 12 000 i zaokrąglić w dół:
źródło
Możesz do tego użyć operacji modulo .
źródło
n
jest 6.2, 6.0, 6.12312412, wszyscy mamy"We have a decimal number here!"
?Czy nie byłoby łatwiej przetestować pierwiastki sześcianu? Zacznij od 20 (20 ** 3 = 8000) i idź do 30 (30 ** 3 = 27000). Następnie musisz przetestować mniej niż 10 liczb całkowitych.
źródło
n**(1/3)
liczby całkowitej. Na przykład na moim komputerze `10648 ** (1/3) = 21.99999999999999996` zamiast22
: problem! Przy metodzie tej odpowiedzi nie ma takiego problemu. Myślę, że jest to jedyne poprawne rozwiązanie z matematycznego punktu widzenia (inne rozwiązania są poprawne w języku Python).Co powiesz na
źródło
Powyższe odpowiedzi działają w wielu przypadkach, ale niektóre pomijają. Rozważ następujące:
Wykorzystując to jako punkt odniesienia, niektóre inne sugestie nie zachowują się tak, jak byśmy chcieli:
Zamiast tego spróbuj:
teraz otrzymujemy:
isclose
pochodzi z Python 3.5+ , a dla innych Pythona możesz użyć tej w większości równoważnej definicji (jak wspomniano w odpowiednim PEP )źródło
math.fsum([0.1] * 10) == 1
Po prostu informacje dodatkowe,
is_integer
robi wewnętrznie:źródło
Wszystkie odpowiedzi są dobre, ale pewna byłaby metoda ognia
Funkcja zwraca wartość Prawda, jeśli jest liczbą całkowitą. Fałsz .... Wiem, że jestem trochę spóźniony, ale oto jedna z interesujących metod, które zrobiłem ...
Edycja: jak stwierdzono w komentarzu poniżej, tańszym równoważnym testem byłoby:
źródło
n % 1 == 0
. W takim przypadku wykonujesz dwie operacje, które są droższe w przypadku tańszego równoważnego testu.źródło
Spróbuj użyć:
Zapewni znacznie większą precyzję niż jakiekolwiek inne metody.
źródło
Możesz użyć
round
funkcji do obliczenia wartości.Tak w pythonie, jak wielu wskazywało, gdy obliczamy wartość pierwiastka kostki, da to wynik z niewielkim błędem. Aby sprawdzić, czy wartość jest liczbą całkowitą, możesz użyć następującej funkcji:
Pamiętaj jednak, że
int(n)
jest to równoważnemath.floor
z tego powodu, jeśli znajdzieszint(41063625**(1.0/3.0))
344 zamiast 345.Dlatego należy zachować ostrożność, używając
int
korzeni sześcianu.źródło