Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 5
1

Погрешность при вычислениях

13.07.2017, 03:08. Показов 1664. Ответов 5

Вкратце условие задачи: Есть N счетов, нам нужно соединить их в один так: берется два счета и прибавляются друг к другу и при этом отнимается процент от их суммы. Проблема в том что при многих операциях соединения появляется погрешность больше чем 0.1, нужно ее уменьшить
Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;
int main()
{
    priority_queue <long double> s;
    long double b, a1, a2, a3, c;
    int a;
    cin >> a >> c;
    for (int i(0); i < a; i++)
    {
        cin >> b;
        s.push(-b);
    }
    long double p = 1 - (c / 100);
    while (s.size() != 1)
    {
        a1 = -s.top();
        s.pop();
        a2 = -s.top();
        s.pop();
        a3 = (a1 + a2) * p;
        s.push(-a3);
    }
    long double digit = -s.top();
    cout << digit;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2017, 03:08
Ответы с готовыми решениями:

Погрешность в вычислениях
Есть зщадание вычислить значения для {y}_{n}=\frac{1}{n}-5{y}_{n-1} если n=0,1,2,3,...,16. зная что...

Некорректные значения при вычислениях
Написал программу,присвоил значения переменным и всё было хорошо. Потребовалось сделать так,чтобы...

Будут ли выполнены любые неявные преобразование типов при вычислениях примера
У меня есть переменные : char x3=3; char x0=0; char x2=2; и пример: x3 = ’a’ + x0 – x2; ...

Погрешность при вычислениях - исправить ошибку в коде
Program C1; Label 222; var d,U,V,y,R:real; begin write('Введите V,d,U'); readln(V,d,U);...

5
Заблокирован
13.07.2017, 03:14 2
ilyasiv, для оперирования баблом нужно использовать специальные типы, а не искать способ уменьшить погрешность long double.
0
3836 / 2768 / 641
Регистрация: 08.06.2007
Сообщений: 9,456
Записей в блоге: 4
13.07.2017, 03:31 3
Цитата Сообщение от ilyasiv Посмотреть сообщение
появляется погрешность больше чем 0.1
Откуда вы это знаете? У вас есть истинное значение?
Задачу вы не описали, так что мы не знаем, что должно быть. Но зато вы предъявили алгоритм, который объединяет счета попарно в некотором порядке, причем результат зависит от того, в каком порядке объединяются счета. От счетов, которые объединяются первыми отнимается больший процент, чем от тех счетов, которые учитываются последними. То что вы попросили сделать компьютер, то он и сделал.
0
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 5
13.07.2017, 03:47  [ТС] 4
Ссылка на задачу: https://www.e-olymp.com/ru/problems/21
Проверенно мною что при выводе +- 0.1 система все равно засчитывает решение
0
3836 / 2768 / 641
Регистрация: 08.06.2007
Сообщений: 9,456
Записей в блоге: 4
13.07.2017, 10:34 5
Лучший ответ Сообщение было отмечено ilyasiv как решение

Решение

Тогда справедливо замечание daun-autist. Результат счета денег должен сходиться до копейки. Данные задачи таковы, что вас устроит тип __int64, денежные суммы выражайте в копейках. Новую сумму вычисляйте как
C++
1
2
a3 = a1 + a2;
a3 = a3 - a3 * c / 100;
c -- целое
Возможно, понадобится еще применить еще какое-то правило округления, о котором в задаче не говорится. Тогда добавьте еще одну строчку
C++
1
if(a3 * c % 100 >= 50) a3++;
компилятор должен это соптимизировать, или оптимизируйте вручную.

Добавлено через 9 минут
Если c может быть не целым, тогда вводите его как строку и переводите в 2 c/c вручную как дробь. Числитель будет c с отброшенной точкой, знаменатель соответствующая степень десяти. С этими двумя целыми числами и работайте.
1
Комп_Оратор)
Эксперт по математике/физике
8724 / 4455 / 598
Регистрация: 04.12.2011
Сообщений: 13,308
Записей в блоге: 16
13.07.2017, 10:38 6
ilyasiv, в моём блоге есть программка - aneasycalc. Она умеет выбирать последовательности операций так, чтобы сводить погрешность потерю точности к минимуму. Вы можете посчитав на ней определить, есть ли отклонение и какова его величина, при различных исходных данных.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2017, 10:38

Ошибка при вычислениях
Подскажите где ошибка ??

Нежелательное округление при вычислениях
Поздравляю уважаемых участников форума с прошедшими праздниками, и прошу прощения за банальный...

Несанкционированное округление при вычислениях
раньше для решения своих задач использовал эксель, сейчас решил попробовать что то другое...

Ошибка NaN при вычислениях
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru