Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Каковая точность округления? - C++

12.08.2013, 13:15. Просмотров 642. Ответов 19
Метки нет (Все метки)

Какова точность округления у таких функций, как round/ceil/floor? Сколько раз я могу просуммировать число с погрешностью (имеется ввиду, что у меня уже есть число x=0.000000..1 и до каких пор выражение y += x будет удовлетворять условию round(y) == 0f)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2013, 13:15     Каковая точность округления?
Посмотрите здесь:

Как задать точность округления в среде разработки? - C++
Недавно столкнулся с тем, что любая переменная вещественного типа при инициализации и выводе этой же переменной на экран отображается лишь...

Чудеса округления - C++
Не могу посчитать i-ый член по формуле разности Ньютона (см. прикреплённый файл). Из-за округления я не могу получить члены после j...

Как убрать округления - C++
Вообщем есть набор чисел. Например: visual studio округляет число типа double - вместо 22995,56 пишет 22995,6. Как заставить её забыть...

Как избавиться от округления - C++
Доброго времени суток. У меня следующая проблема. pp = 0.1534886 + 151.5235 - 0.15668835467; pp имеет тип double, но в качестве...

Функция округления double - C++
Как в С++ округлить double до int? С помощью какой функции?

Метод округления числа - C++
Метод округления числа введонного с клавиатуры. Например вводим 2,5 , а выводит 3 ;

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:11     Каковая точность округления? #2
У этих функций точность округления до целых.

Добавлено через 4 минуты
ceil( 0.0001 ) == 1
floor( 0.0001 ) == 0
Это для примера.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 14:12  [ТС]     Каковая точность округления? #3
castaway, поэтому я и спрашиваю - какова точность, ведь погрешность есть почти всегда
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:16     Каковая точность округления? #4
Поэтому я и отвечаю, что точность - до целых. А какой вообще погрешности идет речь?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 14:17  [ТС]     Каковая точность округления? #5
castaway,
о той, при которой нельзя сравнивать два числа float обычным "==", а нужно через epsilon
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:27     Каковая точность округления? #6
А при чем тут floor и ceil ?
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
12.08.2013, 14:38     Каковая точность округления? #7
Цитата Сообщение от nexen Посмотреть сообщение
при которой нельзя сравнивать два числа float обычным "=="
Этого вообще лучше не делать
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 14:41  [ТС]     Каковая точность округления? #8
Croessmah, ну я и не делаю. Поэтому и хочу узнать, до какого знака библиотечная функция сравнения float/double-ов работает, а так же насколько точно округляют приведенные функции, ведь если в числе уже погрешность, то из 0.0.....01 выйдет 1, что мне не нужно :\
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:58     Каковая точность округления? #9
Я вот не пойму, ты либо не умеешь задавать вопросы, либо сам не понимаешь что хочешь спросить.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 16:20     Каковая точность округления? #10
Цитата Сообщение от nexen Посмотреть сообщение
у меня уже есть число x=0.000000..1 и до каких пор выражение y += x будет удовлетворять условию round(y) == 0f)?
До тех пор пока y не достигнет 0.5
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <limits>
 
int main() {
    double eps = std::numeric_limits<double>::epsilon();
    std::cout << 0.5/eps << std::endl;
    return 0;
}
И будет это через 2.2518e+15 итераций.
P.S. Зависит от реализации в общем случае.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 17:09  [ТС]     Каковая точность округления? #11
Tulosba, спутал здесь функцию round и ceil.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 17:28     Каковая точность округления? #12
Цитата Сообщение от nexen Посмотреть сообщение
спутал здесь функцию round и ceil.
Так ceil() вернет 1 для числа (0..1].
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 17:34  [ТС]     Каковая точность округления? #13
Tulosba, то есть любая погрешность и всё - 1? Предположим, что я хочу сранвить X и Y, которые должны быть равны с некоторой точностью и мне показывает, что они равны, но какую бы я точность не ставил, ceil(abs(x-y)) вернет 1? Т.е. ceil работает без точности, а со всей дробной частью числа?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 17:42     Каковая точность округления? #14
nexen, http://en.cppreference.com/w/cpp/numeric/math/ceil
Nearest integer not less than arg
Возвращает ближайшее целое не меньше аргумента.

Не по теме:

P.S. c abs() осторожнее, потому что std::abs() перегружена для разных типов аргументов и нормально работает как с целыми, так и с вещественными. А вот сишная abs() принимает целый аргумент. И abs(0.1), скажем, будет воспринято как abs( (int)0.1 ), т.е. abs(0).

nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 17:45  [ТС]     Каковая точность округления? #15
Tulosba, ну да, я о том и говорю, что ceil(0.00..01) = 1, где последняя 1 в 0 - погрешность.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 17:50     Каковая точность округления? #16
nexen, ceil() для минимально представимого double вернет единицу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cmath>
#include <limits>
 
int main() {
 
    double min = std::numeric_limits<double>::min();
    std::cout << min << std::endl;
    std::cout << std::ceil(min) << std::endl;
    
    return 0;
}
2.22507e-308
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 17:59  [ТС]     Каковая точность округления? #17
Tulosba, а что же тогда делать? От погрешности, естественно, не избавиться. Неужели свою ceil писать с epsilon?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 18:05     Каковая точность округления? #18
Цитата Сообщение от nexen Посмотреть сообщение
а что же тогда делать?
Так, а что надо-то? Какая задача стоит?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 18:16  [ТС]     Каковая точность округления? #19
Tulosba, ну это было не так уж и важно, вот и не написал. А так задача по координатам определить к каким ячейкам принадлежит объект. Я использовал ceil, но заметил баг, который появлялся из-за накопления погрешности в координатах.

Допустим, есть ячейки с индексами [0][0], [0][1], [1][0], [1][1], а объект находится в [0][0.4] - тогда исхомые ячейки [0][0] и [0][1], но ceil с этим не согласилась, ведь [0.0.....01][0.4] = [1][1]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 18:26     Каковая точность округления?
Еще ссылки по теме:

Функция округления чисел - C++
Здравствуйте, подскажите пожалуйста. Написала функцию округления цифр void RoundingFunction(double RoundingVariable, int&amp;...

Написать программу округления числа - C++
Напишите программу, в которой с помощью round() округляется значение типа double. Для разложения числа на целую и дробную часть...

Ошибка округления - Сумма с синусом - C++
Добрый день! Помогите пожалуйста понять в чем причина. При проверке кода на моем компьютере при вводе числа 1000, выдает корректный...

как избавиться от округления float - C++
#include &lt;iostream&gt; using std:: cin; using std:: cout; using std:: endl; int main() { cout &lt;&lt; &quot;123.008 + 0.0008 = &quot; &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 18:26     Каковая точность округления? #20
Цитата Сообщение от nexen Посмотреть сообщение
объект находится в [0][0.4] - тогда исхомые ячейки [0][0] и [0][1]
Ну, если первая координата ноль, то:
[0][floor(0.4)] = [0][0]
[0][ceil(0.4)] = [0][1]
Хотя можно ведь и первую координату таким же образом обработать.
Yandex
Объявления
12.08.2013, 18:26     Каковая точность округления?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru