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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Странная работа функции ceil [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: я не профи, помогите, пожалуйста.
movEAX
Отправлено: 20 Февраля, 2011 - 09:38:22
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




echo ceil(round(0.28*100,2));
работает как надо.


-----
армия.. самое убогое место
 
 Top
Джур
Отправлено: 20 Февраля, 2011 - 11:35:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007  


Помог: 0 раз(а)




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


-----
Тамбовский каджит тебе товарищ
 
 Top
movEAX
Отправлено: 20 Февраля, 2011 - 11:52:48
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Джур пишет:

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

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

И будьте любезны, читайте топик не по принципу стека.


-----
армия.. самое убогое место
 
 Top
JustUserR
Отправлено: 21 Февраля, 2011 - 17:40:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
dessor
Отправлено: 21 Февраля, 2011 - 22:31:21
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




movEAX пишет:
echo ceil(round(0.28*100,2));
работает как надо.

Увы, как надо не работает Улыбка потому как нужно жесткое округление в большую сторону Улыбка даже если ввели 0.280000001, должно получится 29...
Собственно, я вообще забил на ceil и использваол для решения этой проблемы регулярные выражения. Как говорится, грубо, но эффективно Улыбка
Код счас не приведу, не дома, но в любом раскладе, это не сложное рег.выражение)
(Добавление)
Хотя, конечно, можно и ограничиться разумным числом, скажем в 4-5 знаков. В таком раскладе, представленное решение подойдет. Спасибо!
 
 Top
JustUserR
Отправлено: 23 Февраля, 2011 - 19:33:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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. }


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
dessor
Отправлено: 18 Марта, 2011 - 22:24:15
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




Извиняюсь за отклонение от темы, но таки еще особенности 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 совсем не пригоден для вычсилений с плавающей точкой, даже элементарных Недовольство, огорчение
 
 Top
DlTA
Отправлено: 18 Марта, 2011 - 22:48:11
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




dessor
в чистом виде непригоден!
не знаю как он считает но погрешность в одну энтую постоянно вылазила
 
 Top
Champion Супермодератор
Отправлено: 19 Марта, 2011 - 08:59:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




dessor пишет:
Это же касается 1.14, 1.15, 1.16.
Сдается мне, что PHP совсем не пригоден для вычсилений с плавающей точкой,
А еще в школе рассказывают как в компутере хранятся данные. В любом языке. Не бывает в двоичной системе счисления числа ровно 1.14. Нигде, ни в каком языке.
 
 Top
dessor
Отправлено: 19 Марта, 2011 - 11:31:35
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




Цитата:
А еще в школе рассказывают как в компутере хранятся данные. В любом языке. Не бывает в двоичной системе счисления числа ровно 1.14. Нигде, ни в каком языке.


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

PHP надо дорабоатывать и дорабатывать... На Perl пока перейти что ли...
 
 Top
Champion Супермодератор
Отправлено: 19 Марта, 2011 - 11:55:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




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]
А расскажи, что происходило у тебя в голове, когда ты решил округлять целые числа до целых значений, а?
 
 Top
JustUserR
Отправлено: 20 Марта, 2011 - 00:28:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




dessor пишет:
PHP надо дорабоатывать и дорабатывать... На Perl пока перейти что ли...
Осуществление возникновение предполагаемого аспекта фунционирования PHP-приложения связано с проведением целевых вычислений, в условиях недостаточной обусловленности целевых входных числовых информационных полей, вследствие обеспечения влияние которых производится хранение числовных данных во вложенном уровне элементного декралационного трактования, не позволящего осуществлять заданную оценку принадлежности числа к дискретному интервалу с фиксированной плавающей точкой


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB