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]
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
echo ceil(round(0.28*100,2));
работает как надо.
----- армия.. самое убогое место
Джур
Отправлено: 20 Февраля, 2011 - 11:35:27
Посетитель
Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007
Помог: 0 раз(а)
Ну, как бы да.
Сначала умножается, получаешь 28, затем округляется до 2-х знаков после точки... 28->28, затем округляешь по точке в плюс, опять таки 28->28.
----- Тамбовский каджит тебе товарищ
movEAX
Отправлено: 20 Февраля, 2011 - 11:52:48
Частый посетитель
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
Джур пишет:
Сначала умножается, получаешь 28, затем округляется до 2-х знаков после точки... 28->28, затем округляешь по точке в плюс, опять таки 28->28.
Дело в том, что по какой-то причине в дробной части 0.28 после сотых имеются другие числа. 2ка была взята произвольно.
И будьте любезны, читайте топик не по принципу стека.
----- армия.. самое убогое место
JustUserR
Отправлено: 21 Февраля, 2011 - 17:40:22
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
movEAX пишет:
echo ceil(round(0.28*100,2));
работает как надо.
Использование предполагаемой конструкции не позволяет осуществить рассмотрение оригинального вопроса связанноо с фунционирование алгоритмов числнного округления при использовании информационных полей типа с плавающей точкой - поскольку при обеспечении генерации внутреннего формата хранения числа с отсутствующей или фиксированной точкой осуществляется выбор фиксированного округления в меньшую сторону в случае недостатка ассоциированных разрядов - в то время как использование чисел в плавающей точной предполагает осуществление поиска ближайшего приближения элемента для которого возможно существование как положительной так и отрицательной величины погрешности
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
dessor
Отправлено: 21 Февраля, 2011 - 22:31:21
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
movEAX пишет:
echo ceil(round(0.28*100,2));
работает как надо.
Увы, как надо не работает потому как нужно жесткое округление в большую сторону даже если ввели 0.280000001, должно получится 29...
Собственно, я вообще забил на ceil и использваол для решения этой проблемы регулярные выражения. Как говорится, грубо, но эффективно
Код счас не приведу, не дома, но в любом раскладе, это не сложное рег.выражение) (Добавление)
Хотя, конечно, можно и ограничиться разумным числом, скажем в 4-5 знаков. В таком раскладе, представленное решение подойдет. Спасибо!
JustUserR
Отправлено: 23 Февраля, 2011 - 19:33:36
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
dessor пишет:
Увы, как надо не работает потому как нужно жесткое округление в большую сторону даже если ввели 0.280000001, должно получится 29...
Использование информационных полей для хранения чисел с плавающей точкой одиночной и двойной точности, предполагает осуществления с данными элементами исключительно фиксированного набора операций, позволяющих обеспечить предшествующую коррекцию возможной возникающей положительной или отрицательной погрешности смещения; в качестве возможного явного варианта решения предполагаемой задачи, возможно осуществление расчета ассоциированного целого числа для рассматриваемого аргумента, с условием проведения вычисления для внедренной дополнительной положительной и отрацательной погрешности, и выбором корректного результата проведенной операции
В частности необходимо осуществить расчет значений целых ассоциированных элементов для $val+EPS и $val-EPS соответственно по следующей схеме, обеспечивающей нахождение непосредственного расположенного целевого числа для элементов, которые превышают его не более чем на EPS-значение; в идеальном варианте в качестве целевого значения смещения осуществляется выбор такого параметра, обеспечивающего максимальное положительное смещение для целого числа с формата хранения элемента с плавающей точкой
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
dessor
Отправлено: 18 Марта, 2011 - 22:24:15
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
Извиняюсь за отклонение от темы, но таки еще особенности php:
Это же касается 1.14, 1.15, 1.16.
Сдается мне, что PHP совсем не пригоден для вычсилений с плавающей точкой, даже элементарных
DlTA
Отправлено: 18 Марта, 2011 - 22:48:11
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
dessor
в чистом виде непригоден!
не знаю как он считает но погрешность в одну энтую постоянно вылазила
Champion
Отправлено: 19 Марта, 2011 - 08:59:20
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
dessor пишет:
Это же касается 1.14, 1.15, 1.16.
Сдается мне, что PHP совсем не пригоден для вычсилений с плавающей точкой,
А еще в школе рассказывают как в компутере хранятся данные. В любом языке. Не бывает в двоичной системе счисления числа ровно 1.14. Нигде, ни в каком языке.
dessor
Отправлено: 19 Марта, 2011 - 11:31:35
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
Цитата:
А еще в школе рассказывают как в компутере хранятся данные. В любом языке. Не бывает в двоичной системе счисления числа ровно 1.14. Нигде, ни в каком языке.
В любом сколь либо адекватном языке будь то c++ или банальный deplhi нет погрешностей в сотых! Да, конечно она есть в миллиардных или меньших, но высокоуровневые функции эти погрешности учитывают и на вполне достаточной точности (тысячных, миллионных долях) работают правильно! Не надо строить из себя черт знает кого, это по крайней мере - не делает Вам чести!
PHP надо дорабоатывать и дорабатывать... На Perl пока перейти что ли...
Champion
Отправлено: 19 Марта, 2011 - 11:55:40
Активный участник
Покинул форум
Сообщений всего: 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]
А расскажи, что происходило у тебя в голове, когда ты решил округлять целые числа до целых значений, а?
JustUserR
Отправлено: 20 Марта, 2011 - 00:28:32
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
dessor пишет:
PHP надо дорабоатывать и дорабатывать... На Perl пока перейти что ли...
Осуществление возникновение предполагаемого аспекта фунционирования PHP-приложения связано с проведением целевых вычислений, в условиях недостаточной обусловленности целевых входных числовых информационных полей, вследствие обеспечения влияние которых производится хранение числовных данных во вложенном уровне элементного декралационного трактования, не позволящего осуществлять заданную оценку принадлежности числа к дискретному интервалу с фиксированной плавающей точкой
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.