перенес на сервак не работает - несколько дней выяснял причину - докопался до сути, но есть риск что это не единственный глюк который я поймал
причина - неправильная работа с отрицательным float:
на серваке:
Код
cs1816:/var/www/.../robot# php -r "var_dump((-4738698911)^43814);";
int(-2147439834)
int(-2147439834)
на локалхосте:
Код
C:\....\robot\bak20080415>(-4738698911)^43814);";
int(-443704761)
int(-443704761)
ясно дело что число -4738698911 не умещается в 32 бита. на локалхосте работает как раз в с этими 32 битами, а на серваке большое отрицательное число переводиться в 0x80000000 (число примерно равное минус 2 млрд)
платформа сервера Debian 4.0 - сдается мне что это корень всех проблем. PHP и 4й и 5й выдают один и тот же бред
попытался исправить ситуацию - просто поменять знак и проихвести оперцию XOR но не могу понять когда делать вычитание на 2 когда не делать
Код
function myxor(&$op1,$op2){
if(is_float($op1) && $op1<0){
$op1 = -$op1;
// $op1 -= 2;
$sign = -1;
}else{
$sign = 1;
}
$op1 ^= $op2;
$op1*=$sign;
}
if(is_float($op1) && $op1<0){
$op1 = -$op1;
// $op1 -= 2;
$sign = -1;
}else{
$sign = 1;
}
$op1 ^= $op2;
$op1*=$sign;
}
Спустя 2 года, 2 месяца, 8 дней, 19 часов, 11 минут, 22 секунды (23.06.2010 - 23:48) dj_sedoy написал(а):
Как страшно жить...
А можно пару вопросов:
- вот вы меняете знак переменной, не умещающегося в 31 бит в своей функции, вы искреннее верите, что среда выполнения от этого станет 64 битной? просто если в вас угасла вера - ничего не получится.
- вы искренне верите, что "...на серваке большое отрицательное число переводиться в 0x80000000..." ? давайте проверим Вашу веру - попробуйте сделать echo(var_dump(-4738698911));. Вдруг и правда, выведется "...число примерно равное минус 2 млрд..."
- когда-то давно, ещё в детстве, я обращался к незнакомым людям на улице, просил посчитать мне произведение двух огромных чисел, и каждый раз был послан на три буквы. Я искренне, всей душой верил, что эти три буквы - совсем даже не то, что каждый сейчас подумал. Моя вера была сильна и свершилось! вскоре я узнал, что буквы эти - GMP.
А ваша вера сильна?
А можно пару вопросов:
- вот вы меняете знак переменной, не умещающегося в 31 бит в своей функции, вы искреннее верите, что среда выполнения от этого станет 64 битной? просто если в вас угасла вера - ничего не получится.
- вы искренне верите, что "...на серваке большое отрицательное число переводиться в 0x80000000..." ? давайте проверим Вашу веру - попробуйте сделать echo(var_dump(-4738698911));. Вдруг и правда, выведется "...число примерно равное минус 2 млрд..."
- когда-то давно, ещё в детстве, я обращался к незнакомым людям на улице, просил посчитать мне произведение двух огромных чисел, и каждый раз был послан на три буквы. Я искренне, всей душой верил, что эти три буквы - совсем даже не то, что каждый сейчас подумал. Моя вера была сильна и свершилось! вскоре я узнал, что буквы эти - GMP.
А ваша вера сильна?
_____________