Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Странная работа функции ceil [2]
Форумы портала PHP.SU » PHP » Программирование на PHP » Странная работа функции ceil

Страниц (2): « 1 [2]
 

16. movEAX - 20 Февраля, 2011 - 09:38:22 - перейти к сообщению
echo ceil(round(0.28*100,2));
работает как надо.
17. Джур - 20 Февраля, 2011 - 11:35:27 - перейти к сообщению
Ну, как бы да.
Сначала умножается, получаешь 28, затем округляется до 2-х знаков после точки... 28->28, затем округляешь по точке в плюс, опять таки 28->28.
18. movEAX - 20 Февраля, 2011 - 11:52:48 - перейти к сообщению
Джур пишет:

Сначала умножается, получаешь 28, затем округляется до 2-х знаков после точки... 28->28, затем округляешь по точке в плюс, опять таки 28->28.

Дело в том, что по какой-то причине в дробной части 0.28 после сотых имеются другие числа. 2ка была взята произвольно.

И будьте любезны, читайте топик не по принципу стека.
19. JustUserR - 21 Февраля, 2011 - 17:40:22 - перейти к сообщению
movEAX пишет:
echo ceil(round(0.28*100,2));
работает как надо.
Использование предполагаемой конструкции не позволяет осуществить рассмотрение оригинального вопроса связанноо с фунционирование алгоритмов числнного округления при использовании информационных полей типа с плавающей точкой - поскольку при обеспечении генерации внутреннего формата хранения числа с отсутствующей или фиксированной точкой осуществляется выбор фиксированного округления в меньшую сторону в случае недостатка ассоциированных разрядов - в то время как использование чисел в плавающей точной предполагает осуществление поиска ближайшего приближения элемента для которого возможно существование как положительной так и отрицательной величины погрешности
20. dessor - 21 Февраля, 2011 - 22:31:21 - перейти к сообщению
movEAX пишет:
echo ceil(round(0.28*100,2));
работает как надо.

Увы, как надо не работает Улыбка потому как нужно жесткое округление в большую сторону Улыбка даже если ввели 0.280000001, должно получится 29...
Собственно, я вообще забил на ceil и использваол для решения этой проблемы регулярные выражения. Как говорится, грубо, но эффективно Улыбка
Код счас не приведу, не дома, но в любом раскладе, это не сложное рег.выражение)
(Добавление)
Хотя, конечно, можно и ограничиться разумным числом, скажем в 4-5 знаков. В таком раскладе, представленное решение подойдет. Спасибо!
21. JustUserR - 23 Февраля, 2011 - 19:33:36 - перейти к сообщению
dessor пишет:
Увы, как надо не работает потому как нужно жесткое округление в большую сторону даже если ввели 0.280000001, должно получится 29...
Использование информационных полей для хранения чисел с плавающей точкой одиночной и двойной точности, предполагает осуществления с данными элементами исключительно фиксированного набора операций, позволяющих обеспечить предшествующую коррекцию возможной возникающей положительной или отрицательной погрешности смещения; в качестве возможного явного варианта решения предполагаемой задачи, возможно осуществление расчета ассоциированного целого числа для рассматриваемого аргумента, с условием проведения вычисления для внедренной дополнительной положительной и отрацательной погрешности, и выбором корректного результата проведенной операции
В частности необходимо осуществить расчет значений целых ассоциированных элементов для $val+EPS и $val-EPS соответственно по следующей схеме, обеспечивающей нахождение непосредственного расположенного целевого числа для элементов, которые превышают его не более чем на EPS-значение; в идеальном варианте в качестве целевого значения смещения осуществляется выбор такого параметра, обеспечивающего максимальное положительное смещение для целого числа с формата хранения элемента с плавающей точкой
PHP:
скопировать код в буфер обмена
  1. function real_ceil($arg)
  2. {$EPS=0.00005;
  3. $cl1=intval(ceil($arg+$EPS));
  4. $cl2=intval(ceil($arg-$EPS));
  5. if($cl1==$cl2) {return $cl2;}
  6. else {if($arg-$cl1<$EPS)
  7. {return $cl1;}
  8. else {return $cl2;}
  9. }
  10. }
22. dessor - 18 Марта, 2011 - 22:24:15 - перейти к сообщению
Извиняюсь за отклонение от темы, но таки еще особенности php:
Цитата:
$a=1.13*100;
echo ceil((float)$a). '<br />';
echo ceil((int)$a);
echo '<br />---//---<br />';
echo intval($a). '<br />';
echo round($a);

Это же касается 1.14, 1.15, 1.16.
Сдается мне, что PHP совсем не пригоден для вычсилений с плавающей точкой, даже элементарных Недовольство, огорчение
23. DlTA - 18 Марта, 2011 - 22:48:11 - перейти к сообщению
dessor
в чистом виде непригоден!
не знаю как он считает но погрешность в одну энтую постоянно вылазила
24. Champion - 19 Марта, 2011 - 08:59:20 - перейти к сообщению
dessor пишет:
Это же касается 1.14, 1.15, 1.16.
Сдается мне, что PHP совсем не пригоден для вычсилений с плавающей точкой,
А еще в школе рассказывают как в компутере хранятся данные. В любом языке. Не бывает в двоичной системе счисления числа ровно 1.14. Нигде, ни в каком языке.
25. dessor - 19 Марта, 2011 - 11:31:35 - перейти к сообщению
Цитата:
А еще в школе рассказывают как в компутере хранятся данные. В любом языке. Не бывает в двоичной системе счисления числа ровно 1.14. Нигде, ни в каком языке.


В любом сколь либо адекватном языке будь то c++ или банальный deplhi нет погрешностей в сотых! Да, конечно она есть в миллиардных или меньших, но высокоуровневые функции эти погрешности учитывают и на вполне достаточной точности (тысячных, миллионных долях) работают правильно! Не надо строить из себя черт знает кого, это по крайней мере - не делает Вам чести!

PHP надо дорабоатывать и дорабатывать... На Perl пока перейти что ли...
26. Champion - 19 Марта, 2011 - 11:55:40 - перейти к сообщению
dessor, знаток сколь-нибудь адекватных языков, а скажи, где ты увидел погрешности в сотых долях?
Число 1.13 выглядит примерно как 1.129999999999. И в том же с++ тоже.
Это сотые доли?
echo ceil((float)$a) - округление 112.999 в БОЛЬШУЮ сторону - результат 113 вполне логичен.
echo ceil((int)$a) - выделение целой части от 112.999 - это 112 - целое число. А потом целое число 112 округляется до целого в большую сторону и получается 112 - всё правильно. Что тебя не устраивает?
[code=сpp]double a = 1.13;
int c;
c = (int)(a*100.);
std::cout << c; // угадай что вывело?[/code]
А расскажи, что происходило у тебя в голове, когда ты решил округлять целые числа до целых значений, а?
27. JustUserR - 20 Марта, 2011 - 00:28:32 - перейти к сообщению
dessor пишет:
PHP надо дорабоатывать и дорабатывать... На Perl пока перейти что ли...
Осуществление возникновение предполагаемого аспекта фунционирования PHP-приложения связано с проведением целевых вычислений, в условиях недостаточной обусловленности целевых входных числовых информационных полей, вследствие обеспечения влияние которых производится хранение числовных данных во вложенном уровне элементного декралационного трактования, не позволящего осуществлять заданную оценку принадлежности числа к дискретному интервалу с фиксированной плавающей точкой

 

Powered by ExBB FM 1.0 RC1