PHP мат. операторы (век живи - век учись) @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 15 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: PHP мат. операторы (век живи - век учись)
Сообщение Добавлено: 17 Ноябрь 2006, 03:48:16 
оказывается
Код:
echo ceil(0.07*100)/100)

вернет 0.08 :insane:

и это не является багом:
http://bugs.php.net/bug.php?id=32305

для арифметических вычислений надо пользоваться этими функциями:
http://www.php.net/manual/en/ref.bc.php

Так в каких случаях надо пользоваться простыми арифмет. операторами,
а когда этими функциями? Когда используешь ceil или floor или еще когда :confused:
Iliasaur Муж.
новый человек
9
Сообщения: 88
Зарегистрирован: 10.05.06
Откуда: Иваново
Сообщение Добавлено: 17 Ноябрь 2006, 08:23:15 
AlexShop, из первой ссылки как раз следует, что это самый настоящий баг. Только не баг PHP, а баг представления дробей компьютером вообще. Так что все просто:
Цитата:
never trust floating number results to the last digit and never compare floating point numbers for equality

Цитата из той же первой ссылки. Т.н. простыми операторами (ceil, floor) можно пользоваться если результат не критичен. А вот если писать программу для бухгалтерии и ворочать большими суммами, то... В общем, думайте сами, решайте сами :bye:
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 17 Ноябрь 2006, 15:54:06 

AlexShop писал(а):
оказывается
Код:
echo ceil(0.07*100)/100)

вернет 0.08 :insane:



Чушь. Оно вернет "parse error, unexpected ')', expecting ',' or ';'"
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 17 Ноябрь 2006, 15:55:37 

Iliasaur писал(а):
Т.н. простыми операторами (ceil, floor) можно пользоваться если результат не критичен. А вот если писать программу для бухгалтерии и ворочать большими суммами, то... В общем, думайте сами, решайте сами :bye:



Ответ неверный. Верный ответ: нужно понимать, какие есть способы представления нецелых чисел в компе и в каких целях какие из них следует использовать.

А шаманизм -- не наш метод. :)
Iliasaur Муж.
новый человек
9
Сообщения: 88
Зарегистрирован: 10.05.06
Откуда: Иваново
Сообщение Добавлено: 20 Ноябрь 2006, 14:10:48 
Увы, способ представления нецелых чисел в компе мы выбирать не можем. Зато мы можем выбрать способ, которым будем производить над ними математические операции. И вот если бы у нас было два инструмента: один для операций с целыми числами и один - с нецелыми, то мы воспользовались бы вашим, Crazy, советом: сопоставили бы способы и цели и выбрали бы библиотеку для работы с нецелыми числами. Но в том-то и дело, что оба способа, - и обычные операторы PHP, и специальные библиотеки, - предоставляют средства для работы с нецелыми числами. Оправдывать здесь ошибки якобы неверно выбранным способом - и есть шаманизм, т.к. уж коли стандартные средства PHP за нецелые числа берутся, то мы вправе ожидать от них если не точности, то хотя бы безошибочной работы. Ведь независимо от цели целые числа остаются таковыми всегда и везде. Вы же не станете утверждать что в некоторых случаях ceil((0.07*100)/100) = 0.08 будет верным ответом?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 20 Ноябрь 2006, 14:25:26 

Iliasaur писал(а):
Увы, способ представления нецелых чисел в компе мы выбирать не можем.




Цитата:
For arbitrary precision mathematics PHP offers the Binary Calculator which supports numbers of any size and precision, represented as strings.

Iliasaur Муж.
новый человек
9
Сообщения: 88
Зарегистрирован: 10.05.06
Откуда: Иваново
Сообщение Добавлено: 20 Ноябрь 2006, 15:11:32 
Под представлением нецелых чисел компом я понимаю их представление операционной системой. Во всех ОС ограничено количество знаков после запятой в нецелых числах. Поэтому точность в операциях над ними всегда будет страдать. Это почти цитата из того же источника. То, что предлагает Binary Calculator в PHP - это всего лишь способ обойти неточность, которая заложена в ОС. Демагогия, в общем.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 20 Ноябрь 2006, 15:25:23 
Iliasaur, ты бредишь. Честно.

Открой книжки и прочитай, какие есть способы работы с числами в компе. Чем отличаются arbitrary precision от limited precision (если мне память не изменяет) и т.п.

Мне откровенно лень разбирать по пунктам всю ту чушь, что ты понаписал.
Iliasaur Муж.
новый человек
9
Сообщения: 88
Зарегистрирован: 10.05.06
Откуда: Иваново
Сообщение Добавлено: 20 Ноябрь 2006, 16:02:03 
Попробовал в гугле поискать, ничего токового не нашел. А книжку искать лень, т.к из названий arbitrary precision и limited precision уже в общих чертах все понятно. Вот если бы можно было взглянуть на исходники функций BCMath, тогда бы мы поспорили. Они же даже числа числами не представляют:
Цитата:
numbers of any size and precision, represented as strings

. А в остальном просто промолчу, дабы правила форума не нарушать.
Jamakaser Муж.
участник
91
Сообщения: 1163
Зарегистрирован: 26.01.05
Сообщение Добавлено: 20 Ноябрь 2006, 17:10:08 

Iliasaur писал(а):
Они же даже числа числами не представляют:
Цитата:
numbers of any size and precision, represented as strings

. А в остальном просто промолчу, дабы правила форума не нарушать.



Ага, полезно помолчать.

_________________
Найди кликабельный пиксель -->
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 20 Ноябрь 2006, 20:44:12 
AlexShop, You are magnifying floating point errors. No bug here.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 20 Ноябрь 2006, 21:16:19 
Ainur, ты еще попробуй это Iliasaur'у объяснить. :)
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 21 Ноябрь 2006, 13:29:40 
Crazy, Попробую. :)

Iliasaur, You are magnifying floating point errors. No bug here.
Iliasaur Муж.
новый человек
9
Сообщения: 88
Зарегистрирован: 10.05.06
Откуда: Иваново
Сообщение Добавлено: 22 Ноябрь 2006, 07:11:19 
Хорошо, а что такое вообще bug?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 22 Ноябрь 2006, 14:29:51 
Тема закрыта. Причина — «Ввиду окончания конструктивной части дискуссии».
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 15 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100