Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS->PHP] Przepisana funkcja nie działa w PHP
Forum PHP.pl > Forum > PHP
robson_admin
Witam,

Przepisałem funkcje z JS do PHP i niestety zwraca mi całkowicie inne wyniki, a co lepsze na każdym serwerze wyniki te są zupełnie inne. Natomiast funkcja w JS na każdym komputerze działa prawidłowo. Wydaje mi się, że nigdzie nie zrobiłem literówki. Potrzebuję otrzymać takie same wyniki w PHP jak w JS.

Proszę o pomoc smile.gif
Z góry dzięki;)


//Problem rozwiązany Proszę zamknąć
// Proponowane rozwiązanie niestety się nie sprawdziło
Crozin
Jest tu kilka potencjalnych problemów:
1. Deweloperzy PHP dali dupy i długość typu INT jest zmienna, 64 bity na maszynie 64 bitowej i 32 bity na 32 bitowej, stąd przy wszelkich operacjach na bitach dobrze jest rozróżnić na jakiej platformie się pracuje.
2. Na 32 bitowej maszynie INT w PHP ma zakres -2147483648 - 2147483647. Wpisanie 4523419682 powoduje, że liczba ta będzie traktowana nie jako INT, a FLOAT.

Rozwiązaniem będzie skorzystanie z GMP.
robson_admin
Cytat(Crozin @ 3.08.2011, 12:09:56 ) *
Jest tu kilka potencjalnych problemów:
1. Deweloperzy PHP dali dupy i długość typu INT jest zmienna, 64 bity na maszynie 64 bitowej i 32 bity na 32 bitowej, stąd przy wszelkich operacjach na bitach dobrze jest rozróżnić na jakiej platformie się pracuje.
2. Na 32 bitowej maszynie INT w PHP ma zakres -2147483648 - 2147483647. Wpisanie 4523419682 powoduje, że liczba ta będzie traktowana nie jako INT, a FLOAT.

Rozwiązaniem będzie skorzystanie z GMP.



  1. var_dump(4523419682) // int(4523419682)

Wychodzi na to że mam 64 bitowy system. Może jakoś na tym systemie da się to zrobić?

Niestety nie mam w kompilowanej obsługi GMP...
  1. Fatal error: Call to undefined function gmp_add() ...
Fifi209
A zastosowałeś się do:
Cytat
Under Windows you will need to uncomment the line

;extension=php_gmp.dll

within the php.ini and restart Apache.


?
robson_admin
Cytat(Fifi209 @ 3.08.2011, 12:52:26 ) *
A zastosowałeś się do:


?

niestety to nie jest serwer na Windowsie....
Crozin
Całość jest trochę pokręcona.

W JS liczby (typ Number) są przechowywane wewnętrznie jako typ FLOAT, który udostępnia 53-bitową (czy coś koło tego) precyzję dla liczb całkowitych. Jednakże wszystkie operacje bitowe (włącznie z przesunięciami) są już realizowane na 32-biotwej reprezentacji argumentów operatora: przykład

W PHP natomiast liczby (całkowite) są przechowywane jako 32-bitowy lub 64-bitowy INTEGER, a operacje na bitach są w ich przypadku przeprowadzone na pełnej reprezentacji tych liczb (czyli ponownie 32 lub 64 bity są brane pod uwagę). Niestety wszystkie serwisy z serii "wrzuć i odpal kod online" jakie znam działają na 32-bitowych maszynach więc bez przykładu. wink.gif

Dlatego też chcąc przenieść ten kod z JS do PHP musiałbyś:
1. Zadbać o to by początkowe argumenty przekazane do funkcji miały dokładnie taką samą reprezentację bitową.
2. W PHP rozróżniać systemy 32-u i 64-o bitowe, co wiąże się z użyciem różnych wartości przesunięć.
3. W PHP na maszynach 64-bitowych wyniki wszystkich operacji bitowych ucinać do ostatnich 32-bitów.

Cytat
niestety to nie jest serwer na Windowsie....
http://pl.php.net/manual/en/gmp.installation.php
A jeżeli nie chce Ci się / nie masz możliwości ponownie komplować może chociaż uda Ci się wrzucić gotowy plik php_gmp.so?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.