powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Погрешности при вычитании целого числа из double
8 сообщений из 8, страница 1 из 1
Погрешности при вычитании целого числа из double
    #38172743
IgorWZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые, помогите решить проблему.
При вычитании 38 из 38.885 получаю
0,884999999999998 !

double ag, ag2, res;
ag = 38.885;
ag2 = 38.0;
res = ag - ag2;

res = 0,884999999999998

Далее res должно быть умножено на 1000 и применена функция floor();
В итоге имеем 884 вместо 885 !
Как избавиться от таких погрешностей?
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38172755
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorWZ,

floor - неудачная функция для округления

round даст правильный результат. а избавиться от погрешностей никак - так уж устроена плавающая арифметика
Код: plaintext
1.
2.
3.
double round(double r) {
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38172760
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorWZ,

Сначала надо округлить результат до точности аргументов, а уже потом использовать floor.
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38172762
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилfloor - неудачная функция для округления

А кто сказал что тут требуется округление? :)
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38172766
IgorWZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно знать точно три знака после запятой, точнее третий знак - это десятые доли копейки. floor дает ближайшее снизу число, без оглядки на 4 и последующие знаки.
Вроде бы то, что нужно.
Но почему такая погрешность получается при вычитании? На ровном месте!
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38172790
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorWZМне нужно знать точно три знака после запятой, точнее третий знак - это десятые доли копейки. floor дает ближайшее снизу число, без оглядки на 4 и последующие знаки.
Вроде бы то, что нужно.
Но почему такая погрешность получается при вычитании? На ровном месте!

Для начала ответь ты: сколько вещественных чисел вмещается диапазоне от 0 до 1? А какое число разрядов в твоем компьютере? А теперь подумай как бесконечное множество вещественных чисел можно представить конечным числом разрядов? По-идее остальные выводы ты можешь сделать сам:
- только некоторое подмножество вещественных чисел можно представить в памяти компьютера точно.
- любое действие с вещественными числами в С++ должно принимать в расчет "неточность" представления, а результат должен трактоваться только с указанной точностью

Ну что, вопрос про вычитание на ровном месте снимаешь?
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38172793
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorWZ, ты не понимаешь как работает тип данных double. Вообще его нельзя
использовать для финансовых расчётов.

Или переводи всё в копейки и считай в целых числах или ищи специальные
фреймворки для поддержки денежных величин в С++.
...
Рейтинг: 0 / 0
Погрешности при вычитании целого числа из double
    #38177482
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглите либы, которые делают арифметику с фиксированной точностью после запятой.
По идее, через них должно работать, но считают они, скоерй всего, через cpu а не через fpu (считайте скорость будет медленей, но на сколько не знаю - надо тестить)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Погрешности при вычитании целого числа из double
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]