![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 2.09.2012 Ostrzeżenie: (0%) ![]() ![]() |
Mam taki kod:
Daje on taki wynik: float(0) int(0) float(1) int(1) float(2) int(2) float(3) int(3) float(4) int(3) float(5) int(4) float(6) int(5) float(7) int(6) float(8) int(7) float(9) int(8) itd. Na mój chłopski rozum, pierwiastek z 3 stopnia dowolnej potęgi 3 stopnia z danej liczby daję tę właśnie liczbę, niezależnie od tego, do jakiego typu jest konwertowana. A tutaj począwszy od 4 widoczna jest różnica. Przy konwersji zachodzi jakby odjęcie 1 od wyniku. I to tylko przy wykładniku 1/3, sprawdzałem dla innych i działa poprawnie. O co może chodzić? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
1/3 to nie jest dla komputera jedna trzecia, tylko to jest 0.333333333333333333333333..... i niestety predzej czy poźniej napotkasz na tym poziomie bledy co zresztą wlasnie doswiadczyles
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 82 Pomógł: 22 Dołączył: 20.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
http://php.net/manual/en/language.types.float.php ramka Floating point precision (floor((0.1+0.7)*10) to 7). I tu nie chodzi o PHP tylko ogolnie reprezentacje liczb zmiennoprzecinkowych: http://floating-point-gui.de/
Zawsze mozna lepiej zaaokraglac wyniki albo uzyc BC Math http://php.net/manual/en/function.bcpow.php |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 2.09.2012 Ostrzeżenie: (0%) ![]() ![]() |
Poradziłem sobie inaczej, bez użycia pow(). Ale trochę powątpiewam, czy to na pewno wina liczb zmiennoprzecinkowych, bo np. dla 1/11 działa. Poza tym wynik jest w zasadzie liczbą całkowitą, tylko typu float, więc powinien spokojnie zrzutować.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 82 Pomógł: 22 Dołączył: 20.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
sprawdz jakie masz precission w ini, php to zaokragla. to ze masz var_dump double 5, nie znaczy ze to jest 5 dokladnie...
Czyli w wyniku jest 4,999.... rzutowane na int daje 4. Jeszcze raz odsylam do linkow wyzej. Wystarczy zaokraglac wyniki do wystarczajacej precyzji albo uzyc bcmath. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.06.2025 - 06:22 |