Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

19
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:11 #2
У этих функций точность округления до целых.

Добавлено через 4 минуты
ceil( 0.0001 ) == 1
floor( 0.0001 ) == 0
Это для примера.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 14:12  [ТС] #3
castaway, поэтому я и спрашиваю - какова точность, ведь погрешность есть почти всегда
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:16 #4
Поэтому я и отвечаю, что точность - до целых. А какой вообще погрешности идет речь?
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 14:17  [ТС] #5
castaway,
о той, при которой нельзя сравнивать два числа float обычным "==", а нужно через epsilon
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:27 #6
А при чем тут floor и ceil ?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
12.08.2013, 14:38 #7
Цитата Сообщение от nexen Посмотреть сообщение
при которой нельзя сравнивать два числа float обычным "=="
Этого вообще лучше не делать
2
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 14:41  [ТС] #8
Croessmah, ну я и не делаю. Поэтому и хочу узнать, до какого знака библиотечная функция сравнения float/double-ов работает, а так же насколько точно округляют приведенные функции, ведь если в числе уже погрешность, то из 0.0.....01 выйдет 1, что мне не нужно :\
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
12.08.2013, 14:58 #9
Я вот не пойму, ты либо не умеешь задавать вопросы, либо сам не понимаешь что хочешь спросить.
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 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. Зависит от реализации в общем случае.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 17:09  [ТС] #11
Tulosba, спутал здесь функцию round и ceil.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2013, 17:28 #12
Цитата Сообщение от nexen Посмотреть сообщение
спутал здесь функцию round и ceil.
Так ceil() вернет 1 для числа (0..1].
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 работает без точности, а со всей дробной частью числа?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 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).

1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2013, 17:45  [ТС] #15
Tulosba, ну да, я о том и говорю, что ceil(0.00..01) = 1, где последняя 1 в 0 - погрешность.
0
12.08.2013, 17:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 17:45
Привет! Вот еще темы с ответами:

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

как избавиться от округления 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;...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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