2013-08-07 10 views
5

Muszę porównać dwie liczby. Jedna z nich pochodzi z kodu Pythona i pochodzi od numpy. Debugger pokazuje, że mają tę samą wartość '29 .0 ', ale typ pierwszy to float, a drugi to float64, więc a == b i a - b == 0 jest . Jak sobie z tym poradzić? Czy jest jakiś sposób, aby wymusić regularną zmienną Pythona na float64 lub numpy domyślnie używać float?Porównaj `float` i` float64` w pytonie

Aktualizacja: Na końcu wszystkie te wartości pochodzą z tego samego pliku, w którym jest napisane 29.0, więc nie sądzę, że istnieją różnice w wartościach numerycznych.

+1

Zazwyczaj porównywanie dowolnych dwóch zmiennych o wartości "a == b" lub "a - b == 0" jest złym pomysłem ze względu na błędy precyzji. Spróbuj zrobić coś w stylu 'abs (a - b) <1e-8' lub coś podobnego. – wflynny

+1

Reprezentacja zmiennoprzecinkowa i arytmetyczne nie są dokładne (mantisse i truncature pb). Ustaw epsilon maksymalnej różnicy (zwykle 10e-10). – lucasg

+0

Podczas gdy te komentarze ogólnie mają rację, nie mogę sobie wyobrazić błędu precyzji w wartości "29.0", jeśli pochodzi on z pliku, który prawdopodobnie jest w formacie ASCII. 29,0 może być dokładnie odwzorowany. – glglgl

Odpowiedz

12

Nie należy porównywać elementów pływających z równością, w żadnym języku programowania, ponieważ nigdy nie można stwierdzić, że są one dokładnie równe. Zamiast tego, należy sprawdzić, czy ich różnica jest mniejsza niż tolerancją:

if abs(a - b) < 1e-10 

więc ten problem nie ma do czynienia z różnicą pomiędzy float i float64 (Python konwertuje je automatycznie), ale z podstawowym problemem porównywanie pływaków dla równości.

Zobacz także What's wrong with using == to compare floats in Java?

+0

Dobra uwaga. Szukałem złą stronę – xander27

+0

Dzięki.Wygląda na to, że mam dużo nadgodzin =) Więc zapomniałem o tej podstawowej rzeczy – xander27

+0

faktycznie można porównać liczbę z równością w językach, które używają symbolicznego obliczenia matematycznego –

7

Jeśli używasz numpy, najlepszym sposobem, aby robić to, co zaproponował Antonis jest użycie funkcji np.allclose(a, b). Możesz także określić tolerancję (1e-10 od góry).