Я использую эту php библиотеку для чтения в документе Excel. По большей части это работает нормально, но если я введу большое отрицательное число длиной более 4 цифр, следующий бит кода больше не вернет правильный результат. Мне немного неясно, как обрабатывать знак с помощью побитовых операций для корректировки кода. Проблема находится в строке 4, когда первый If оценивается как true:
function _GetIEEE754($rknum) {
if (($rknum & 0x02) != 0) {
// this code seems to fail once you get below -9999 to 5 digit negative numbers
$value = $rknum >> 2;
} else {
//mmp
// I got my info on IEEE754 encoding from
// http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
// The RK format calls for using only the most significant 30 bits of the
// 64 bit floating point value. The other 34 bits are assumed to be 0
// So, we use the upper 30 bits of $rknum as follows...
$sign = ($rknum & 0x80000000) >> 31;
$exp = ($rknum & 0x7ff00000) >> 20;
$mantissa = (0x100000 | ($rknum & 0x000ffffc));
$value = $mantissa / pow( 2 , (20- ($exp - 1023)));
if ($sign) {
$value = -1 * $value;
}
//end of changes by mmp
}
if (($rknum & 0x01) != 0) {
$value /= 100;
}
return $value;
}
Как я могу изменить битовый сдвиг, чтобы должным образом учитывать знак для больших чисел? Вот тестовые примеры того, как это должно работать:
Рабочий тестовый пример:
Значение в Excel: -1454.22 (читается как тип mulrk «3238117489»)
_GetIEEE754 (3238117489)
Возвращает: -1454.22
Сбой теста:
Значение в Excel: -12345.03 (читается как введите mulrk «4290029287»)
_GetIEEE754 (4290029287)
Возвращает: 10725073.21
Должен вернуть: -12345.03
Я знаю, что есть другие новее библиотеки для импорта файлов Excel, но этот очень интегрирован в устаревший проект, и я надеюсь избежать такого рефакторинга, если это вообще возможно.