Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вывод больших чисел


Автор: chiffa 10.3.2010, 11:42
Добрый день. После определенного ряда вычислений получаю довольно длинное число, которое выводится как: 1.0542197938321E-081

Подскажите как его можно вывести полностью?....

Автор: ksnk 10.3.2010, 12:04
полностью его скорее всего не вывести. Если поинтересоваться способом хранения вещественных чисе в момпьютере, то можно обнаружить, что число хранится в виде мантиссы - обычного целого числа и порядка - еще одного целого. нормальное число получается когда маттиссу умножают на 2 в степени "порядок", с некоторыми непринципиальными выкрутасами. Так что всех значащих цифр числа компьютер просто не хранит ;)
для любителей точных вычислений можно порекомендовать модуль http://ru2.php.net/manual/en/ref.bc.php - он работает с числами как со строками и может оперировать числами со значительно бОльшим количеством знаков.

Автор: chiffa 10.3.2010, 12:12
спасибо за ответ! а можно ли как то полученое 1.0542197938321E-081 перевести в строку (с полным количеством цифр)?

Автор: Avrely 10.3.2010, 12:14
http://www.icosaedro.it/bignumbers/BigInt.htm  smile 



BigINT может отобразить все число 

Автор: Fortop 10.3.2010, 12:21
Цитата(chiffa @  10.3.2010,  11:12 Найти цитируемый пост)
а можно ли как то полученое 1.0542197938321E-081 перевести в строку (с полным количеством цифр)?

Мда, 2003й год однако...

http://php.net/sprintf
http://php.net/number_format

Автор: chiffa 10.3.2010, 13:11
Avrely, пасиба! то что нужно!

Единственный вопрос: не подскажешь как там провести деление? 

Код

$s = new BigInt("8");
  echo $s->div_rem(8,2);
 

ругается Fatal error: Cannot pass parameter 2 by reference in

Автор: Fortop 10.3.2010, 13:32
Бог ты мой... Вас дружно забанили на php.net?

http://php.net/bcmath
http://php.net/gmp

Автор: chiffa 12.3.2010, 11:37
Fortop, гм... признаю свою вину, меру, степень, глубину... (с)

Но возник небольшой вопрос, возможно даже не так из программирования, как из математики....

Допустим я использую 

Код

$to_barss=bcdiv('58745412554152541256636121255615', '1234567890'); 



результат получаю - 47583784601875998294946

при выполнении 
Код

$mul=bcmul("$to_barss", "1234567890");


результат отличается от исходного - 58745412554152541256635080883940

то что было  58745412554152541256636121255615
то что стало 58745412554152541256635080883940

насколько я понимаю разница получается из-за округления при делении. То есть если использую

Код

$to_barss=bcdiv('58745412554152541256636121255615', '1234567890', 100);


то результат после умножения получаю такой же как исходный. Но после деления - 47583784601875998294946.84270106441857968620907514450258381497351271625.......... а мне нужно только целое число

round ($to_barss,0) возвращяет почему то 0...


Подскажите кто знает как реализовать деление без округления?.... Заранее всем спасибо smile


Автор: Fortop 12.3.2010, 15:04
точность вычислений установить требуемую

Автор: chiffa 12.3.2010, 15:39
так у меня ж прописано 100
Код

$to_barss=bcdiv('58745412554152541256636121255615', '1234567890', 100);


bcscale насколько я понял одно и то же что и напрямую прописать 100

или я тебя неправильно понял?

Автор: Fortop 12.3.2010, 17:01
Цитата(chiffa @  12.3.2010,  14:39 Найти цитируемый пост)
так у меня ж прописано 100

не обратил внимания.

Код

bcscale(100);
$src = '58745412554152541256636121255615';
$to_barss=bcdiv($src, '1234567890'); 
$res=bcmul($to_barss, '1234567890');

var_dump($src, $res);

//58745412554152541256636121255615
//58745412554152541256636121255614.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999729428790

Округления к сожалению нет, но его можно написать самостоятельно.

Сравнивать числа типа float на равенство - нельзя. Обычно обходятся сравнением на < или > c определенной погрешностью.

Например
Код

if ($a < $b + 0.001 && $a > $b - 0.001) {
    // число в пределах погрешности 0.002
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)