Poniższy kod Pythona oblicza liczbę iteracji, które należy wykonać na podstawie niektórych zmiennych.Arytmetyka zmiennoprzecinkowa: możliwe niebezpieczne uzależnienie od konkretnego porównania?
# a - b - c is always a multiple of d.
i = (a - b - c)/d
while i:
# do stuff
i -= 1
Zmienne wszystko będzie tego samego typu, to znaczy tylko ints
lub floats
lub cokolwiek. Obawiam się, czy będzie działać poprawnie, jeśli wartości są floats
. Wiem wystarczająco dużo, aby zawsze brać pod uwagę pułapki polegania na dokładnych wartościach zmiennoprzecinkowych. Ale nie mogę powiedzieć, czy powyższe jest niebezpieczne czy nie. Mogę użyć i = int(round((a - b - c)/d))
, ale jestem ciekawy, jak lepiej zrozumieć pływaki.
Wszystko sprowadza się do następujących elementów: a - b - c
jest dokładną wielokrotnością d
. Więc polegam na (a-b-c)/d
, aby stać się wartością i
, którą mogę odjąć od 1
i uzyskać oczekiwaną liczbę iteracji w pętli while, z domniemanym założeniem, że i == 0
staje się prawdą. To znaczy, czy obliczone wielokrotności mogą być zmniejszane o 1, aby osiągnąć dokładnie 0?
Chciałbym nie tylko wiedzieć, czy jest to niebezpieczne, ale co ważniejsze, co muszę wiedzieć o zmiennoprzecinkowej, aby rozwiązać takie pytanie? Jeśli ktoś wie zdecydowanie, czy jest to bezpieczne czy nie, czy można wyjaśnić, w jaki sposób?
Jeśli uważasz, że 'i' powinien mieć wartość całkowitą, rzuć ją do liczby całkowitej. To przynajmniej zagwarantuje, że twoja pętla się zakończy! – katrielalex