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

Теряется точность - C++

Восстановить пароль Регистрация
 
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
23.08.2011, 20:03     Теряется точность #1
Видимо в этой проге теряетмя точность. Не проходит только 1 тест.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 #include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
 double n,a,b;
 int k,i,j,t;
 scanf("%d",&t);
 for (i=0; i<t; i++)
  {
   scanf("%lf%d",&n,&k);
   a=0.0;
   for (j=1; j<=k-1; j++) { scanf("%lf",&b); a+=b; }
   cout << fixed << setprecision(5) << 1-a/n << endl;
  }
 return 0;
}
Помогите что-то сделать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2011, 20:03     Теряется точность
Посмотрите здесь:

C++ Точность и т.д.
C++ Теряется значение в переменной
C++ Куда теряется точность?
Теряется указатель на переменые в классе C++
Заданная точность C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
23.08.2011, 20:07     Теряется точность #2
Телепатируй уже, что надо-то? Канал для получения задания открыт.
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
23.08.2011, 20:13  [ТС]     Теряется точность #3
В урне находится n шаров, каждый из которых имеет один из k цветов, причём количество шаров каждого цвета, как и сам цвет, известно и написано на отдельной табличке. Дима, начавший изучать теорию вероятности, решил подшутить над своими товарищами и пользуясь случаем, незаметно от остальных заменил все шары какого-то непонравившегося ему цвета шарами совсем других цветов, каждый из которых в надписях на табличках отсутствует, а саму табличку спрятал.
Теперь каждому, кто заходит в аудиторию, он задаёт один и тот же вопрос:
- А скажите-ка мне, с какой вероятностью Вы достанете из урны шар с цветом, не указанным на табличках?
Ваше задание состоит в том, чтобы написать программу, быстро отвечающую на Димины вопросы.

Входные данные

В первой строке задано количество товарищей m (1 ≤ m ≤ 1000), которым Дима задал свой вопрос. Каждая из последующих 2m строк имеет следующую структуру: в первой из них задано два числа n и k (1 ≤ k ≤ n ≤ 10000), а во второй k-1 число, разделённое пробелами - количество шаров очередного известного цвета, написанное на табличке.
Выходные данные
В каждой из m строк должен содержаться ответ к Диминой задачке, выведенный с точностью 5 знаков после запятой.
Пример входных данных
2
10 3
5 3
10 3
3 2
Пример выходных данных
0.20000
0.50000
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
23.08.2011, 20:23     Теряется точность #4
Попробуй (n-a)/n
Если не поможет, попробуй ещё вывод через printf.
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
23.08.2011, 20:23  [ТС]     Теряется точность #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Попробуй (n-a)/n
Если не поможет, попробуй ещё вывод через printf.
Пробовал, фигня
Причём ещё TL на двух тестах появился...
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
23.08.2011, 20:45     Теряется точность #6
Тайм-лимит не может быть связан ни с тем, ни с другим
Хотя непонятно, зачем вводить целые числа как double, это действительно может оказаться медленнее ввода int.
А по поводу точности у меня только одно предположение — округление последнего знака не нужно.
тогда могло бы помочь 1.0e-5*floor((n-a)/n*1.0e5)
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
23.08.2011, 21:00  [ТС]     Теряется точность #7
нет(((
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
23.08.2011, 21:03     Теряется точность #8
А где вы эту задачу сдаете?
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
23.08.2011, 21:09  [ТС]     Теряется точность #9
онлайн контесты
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
23.08.2011, 21:10     Теряется точность #10
Это понятно. Можете дать ссылку на саму задачу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2011, 15:23     Теряется точность
Еще ссылки по теме:

Заданная точность C++
C++ значение массива теряется
Теряется строка при передаче в функцию C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
24.08.2011, 15:23     Теряется точность #11
Проблема видна в этой теме: Цветные шары
В принципе, я считаю подобные задачи на "плавучку" не совсем корректными.

Добавлено через 16 часов 17 минут
Чтобы было понятно, откуда вообще может взяться проблема, можно посмотреть на вывод вот такой программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    for (int i = 1; i < 8; i += 2)
    {
        double v = i*875 / 8000.0;
        cout << fixed << setprecision(5) << v << endl;
        cout << fixed << setprecision(7) << v << endl << endl;
    }
    return 0;
}
Вывод:
Код
$ ./a.out      
0.10938
0.1093750

0.32812
0.3281250

0.54688
0.5468750

0.76562
0.7656250
Проблема самая обычная, неточное представление чисел. То есть число 0.3281250 на самом деле хранится как 0.3281249999... и округляется к 0.32812, хотя точное значение следовало бы округлить к 0.32813.
В общем виде решение проблемы с неточным представлением мне не известно, хотя в данном случае в качестве "объезда" можно было бы прибавлять маленькое число перед выводом, скажем 1.0e-8, или даже std::numeric_limits<double>::epsilon()
Но для общего случая просто используются целочисленные вычисления, где можно получить представление рациональной дроби с любой требуемой точностью.
Yandex
Объявления
24.08.2011, 15:23     Теряется точность
Ответ Создать тему
Опции темы

Текущее время: 18:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru