есть ли разница для математики PHP4 и PHP5

Nikola_N

Новичок
Автор оригинала: neko
напишите какой-нибудь код покороче, который воспроизводит проблему.
PHP:
$zz=4523419682;
$zz =($zz ^ -4653896912);
echo$zz;

php4
-418987246

php5 на фрибсд6
-1919031262

щас поздно, завтра буду дальше думать ...
 

SiMM

Новичок
4523419682 = 0x000000010D9DE822
-4653896912 = 0xFFFFFFFEEA9B2B30

0x000000010D9DE822 ^ 0xFFFFFFFEEA9B2B30 = 0xFFFFFFFFE706C312
0xFFFFFFFFE706C312 = -418987246 (=0xE706C312)

-1919031262 = 0xFFFFFFFF8D9DE822
Получается, что при выполнении логической операции второй аргумент был заменён на 0x80000000, т.е. -MAX_INT32?

[m]language.types.integer[/m] вроде ничего не говорит?
 

Nikola_N

Новичок
Автор оригинала: SiMM
4523419682 = 0x000000010D9DE822
-4653896912 = 0xFFFFFFFEEA9B2B30

0x000000010D9DE822 ^ 0xFFFFFFFEEA9B2B30 = 0xFFFFFFFFE706C312
0xFFFFFFFFE706C312 = -418987246 (=0xE706C312)

-1919031262 = 0xFFFFFFFF8D9DE822
Получается, что при выполнении логической операции второй аргумент был заменён на 0x80000000, т.е. -MAX_INT32?

[m]language.types.integer[/m] вроде ничего не говорит?
получается, что этот код не будет работать на моей конфигурации ? нада ставить на сервер другой софт ..

Превышение размера целого
Если вы определите число, превышающее пределы целого типа, оно будет интерпретировано как число с плавающей точкой. Также, если вы используете оператор, результатом работы которого будет число, превышающее пределы целого, вместо него будет возвращено число с плавающей точкой.


<?php
$large_number = 2147483647;
var_dump($large_number);
// вывод: int(2147483647)

$large_number = 2147483648;
var_dump($large_number);
// вывод: float(2147483648)

// это справедливо и для шестнадцатеричных целых:
var_dump( 0x80000000 );
// вывод: float(2147483648)

$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// вывод: float(50000000000)
?>



Внимание
К сожалению, в PHP была ошибка, так что это не всегда верно работает, когда используются отрицательные числа. Например: когда вы умножаете -50000 * $million, результатом будет -429496728. Однако, если оба операнда положительны, проблем не возникает.

Эта ошибка устранена в PHP 4.1.0.
-~{}~ 16.03.06 13:16:

так что... будут какие идеи (кроме как сменить версию php или ОС)?
или ветвь тупиковая и тема закрыта!
:confused:
 

tony2001

TeaM PHPClub
FreeBSD 5.5-PRERELEASE FreeBSD 5.5-PRERELEASE #4: Tue Mar 7 13:49:31 GMT 2006 i386

код #1:
4523419682 4608221683 4653896912
-790567943 75097448 1822589421

код #2:
./sapi/cli/php -r '$zz=4523419682; $zz =($zz ^ -4653896912); var_dump($zz);'
int(-418987246)

еще вопросы есть?
 

Nikola_N

Новичок
Автор оригинала: tony2001
FreeBSD 5.5-PRERELEASE FreeBSD 5.5-PRERELEASE #4: Tue Mar 7 13:49:31 GMT 2006 i386

код #1:
4523419682 4608221683 4653896912
-790567943 75097448 1822589421

код #2:
./sapi/cli/php -r '$zz=4523419682; $zz =($zz ^ -4653896912); var_dump($zz);'
int(-418987246)

еще вопросы есть?
вопрос в том, чтоб заставить правильно считать этот код
на FreeBSD6.x + php5.x (так как на моем VDS php 5 доступен именно в этой конфигурции. А сомому инсталировать VDS - нет желания да и опыта ). Или я не правильно понял твой ответ ....
 

tony2001

TeaM PHPClub
>вопрос в том, чтоб заставить правильно считать этот код
гм.
я продемонстрировал, что у меня на Фре (на самом деле это не моя Фря, но к делу это не относится) всё работает с PHP5.1.
соотв-но, если у вас на Фре работает не так, то с большой долей вероятности - это либо 64-хбитная машина (о чем я уже говорил) и тогда это нормально, либо и это кривая Фря.
в любом случае - прямая дорога к системному администратору.
 

Solid

Drosera anglica
Если тестировать PHP, то, естественно, это надо делать на одном и том же сервере.
 

tony2001

TeaM PHPClub
svetasmirnova
ага.
а что, в 6-й фре 64-х битная арифметика на 32-х битной платформе?
 

Nikola_N

Новичок
Автор оригинала: Sizz
5.1.2 FreeBSD 5.4-STABLE i386:
4523419682 4608221683 4653896912
-790567943 75097448 1822589421

5.1.2 FreeBSD 6.0-RELEASE-p4 i386:
4523419682 4608221683 4653896912
-330535489 -1818063735 -2099786221
дело в том, что это проблема не только у меня, вот привожу пост еще раз участника данного форума. То же, что и у меня.
Похоже что FreeBSD 6.х+ php5.x приводит к такой ситуёвине... так что повнимательней нада быть с мат. расчетами в этой связке. :cool:
 

Necromant

Новичок
FreeBSD 6.0 x32 , php 5.1.2
4523419682 4608221683 4653896912
-330535489 -1818063735 -2099786221

FreeBSD 6.0 x64 , php 5.1.2
4523419682 4608221683 4653896912
-295818084001244408 -8059991370973567003 -8200868807222890022

вот и все
 

Nikola_N

Новичок
Автор оригинала: Necromant
FreeBSD 6.0 x32 , php 5.1.2
4523419682 4608221683 4653896912
-330535489 -1818063735 -2099786221

FreeBSD 6.0 x64 , php 5.1.2
4523419682 4608221683 4653896912
-295818084001244408 -8059991370973567003 -8200868807222890022

вот и все
Да похоже тут дело в ОС, на которой крутится php :(
Интересно какой тезультат будет при работе кода
на FreeBSD 6.0 на x32 + php4.x
 

riol

Новичок
Автор оригинала: phprus
riol
Можно. Используй http://ru2.php.net/gmp
попробовал, может что не так делаю, но, если оба числа слишком большие(для 32 бит) то работает правильно код:
PHP:
$zz = gmp_init("4523419682",10); 
$zz = gmp_xor($zz, gmp_init("-4653896912",10)); 
echo gmp_strval($zz,10)."<br>";
результат -418987246

а если разные:
PHP:
$zz = gmp_init("-4738698913",10); 
$zz = gmp_xor($zz, gmp_init("43814",10)); 
echo gmp_strval($zz,10)."<br>";
результат -4738672007, а на старой платформе и правильный -443704711

в чем дело?
 

hermit_refined

Отшельник
у меня нет под рукой gmp, но...
всем известно битовое представление отрицательного числа в n-битном случае.
когда же разрядность неограниченна, результат неопределён.
I think, gmp просто представляет его так же, как и противоположное по модулю.
 

riol

Новичок
Автор оригинала: hermit_refined
у меня нет под рукой gmp, но...
всем известно битовое представление отрицательного числа в n-битном случае.
когда же разрядность неограниченна, результат неопределён.
I think, gmp просто представляет его так же, как и противоположное по модулю.
а какие варинты решения проблемы?
 

hermit_refined

Отшельник
если этот скрипт оперировал с большими числами, и при этом выдавал результат тот, который нужен - значит, содержал в себе кривости, которые по счастливой случайности как-то компенсировались.

к счастью, мне не приходилось иметь дела с этим чудным скриптом.
так что - варианты решения не знаю и знать не хочу.
но если бы это понадобилось мне лично, я бы поискал в сети описание этого формата, какие-то другие реализации, etc. и реализовал бы декодирование заново.
что, собственно, и вам посоветую.
 
Сверху