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

double + cout - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.62
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 15:42     double + cout #1
Через cout вывожу double.

C++
1
2
double a =  48.799999999999997;
cout << a;
Выводит: 48.8.

Как сделать, что бы не округляло?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
14.10.2012, 15:49     double + cout #2
C++
1
2
3
double a =  48.799999999999997;
cout.precision(20);
cout << a;
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.10.2012, 15:49     double + cout #3
http://www.cplusplus.com/reference/i...ase/precision/
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:03  [ТС]     double + cout #4
С помощью точности я и так могу. Мне нужно с исходной точностью, но что бы не округляло

Добавлено через 10 минут
вверх
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 16:03     double + cout #5
При выводе double в десятичной системе счисления в любом случае происходит округление, отбрасывающее незначащие десятичные цифры (внутри ведь хранится двоичное число). Так что ставьте precision(100500) и получайте истинно хранимое внутри число, если так уж надо.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:06  [ТС]     double + cout #6
~OhMyGodSoLong~, рисуется таблица. В консоли. Поэтому поставить слишком большую точность не представляется возможным.

Отладчик vs2012 показывает значение 48.799999999999997. Как вывести число с исходной точностью, но не округляя его? И не используя самописных алгоритмов.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 16:09     double + cout #7
Что значит исходная точность? Какой она должна быть?

Вон то число 48.799999999999997 — это на самом деле число 48.7999999999999971578290569595992565155029296875 в памяти из-за особенностей представления чисел с плавающей точкой. double хранит примерно от 15 до 16 десятичных значащих цифр числа (точное количество зависит от самого числа). Для гарантии выводится 17 цифр (одна потенциально незначащая).

Вот с такой точностью? Меньшей? Большей?
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 16:17  [ТС]     double + cout #8
~OhMyGodSoLong~, с той точностью, которая сейчас установлена в cout с помощью функции setprecision. Неужели в cout нету ни одного флага, отвечающего за округление?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 16:43     double + cout #9
Я не понял, в чём проблема?
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <iomanip>
 
int main()
{
  std::cout.precision(5);
  std::cout << 5.123456789 << "\n";
  std::cout << std::setprecision(3) << 5.123456789 << "\n";
  std::cout << 5.123456789 << "\n";
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16845 / 5266 / 323
Регистрация: 30.03.2009
Сообщений: 14,172
Записей в блоге: 26
14.10.2012, 16:54     double + cout #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Как вывести число с исходной точностью
Никак. Потому что данное число изначально нельзя представить точно в двоичном виде. Если, к примеру, взять число 1/3, то ты его в принципе не сможешь напечатать точно в десятичной системе счисления. В зависимости от количество печатаемых знаков можно напечатать как "0.3", "0.33", "0.333" и т.д. Но ты никогда его точно не напечатаешь. В твоей исходной задаче проблема та же самая: ты пишешь в программе число в десятичном виде, а оно не может быть точно переведено в двоичный вид (потому что машина хранит данные в двоичном виде), а следовательно, не может быть в дальнейшем точно напечатано
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 17:23  [ТС]     double + cout #11
Evg, а если я хочу, что бы вывело 48.799999 и все?
ведь можно просто "обрезать" конец?

не самописными функциями
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 17:33     double + cout #12
А, вы про это. Нет, cout, к сожалению, не умеет нормально контролировать способ округления чисел. Только к ближайшему. Можно разве что заставить его выводить как 48.800000 (манипулятор fixed).
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
14.10.2012, 19:36  [ТС]     double + cout #13
Странно, что разработчики STL не подумали об этом...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16845 / 5266 / 323
Регистрация: 30.03.2009
Сообщений: 14,172
Записей в блоге: 26
15.10.2012, 11:06     double + cout #14
Цитата Сообщение от Kgfq Посмотреть сообщение
ведь можно просто "обрезать" конец?
Просто обрезать нельзя, можно только округлять

Цитата Сообщение от Kgfq Посмотреть сообщение
Странно, что разработчики STL не подумали об этом...
О чём? О неправильном округлении?
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
15.10.2012, 15:55  [ТС]     double + cout #15
Evg, о выводе БЕЗ округления вовсе
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16845 / 5266 / 323
Регистрация: 30.03.2009
Сообщений: 14,172
Записей в блоге: 26
15.10.2012, 16:11     double + cout #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Evg, о выводе БЕЗ округления вовсе
Без округления это число будет выглядеть как бесконечная последовательность. Просто разработчики stl знают о том, как в машине хранятся плавающие числа, а ты - нет. Потому они понимают невозможность решения задачи в такой постановке, а ты - нет

Возьми пример из поста #20 и вместо 20 подставь 50, 100, 200 и т.д. Может после этого ты начнёшь всё-таки понимать, о чём тебе тут говорят. Если нет, тогда либо забей на этот вопрос, либо сядь и конкретно разберись с представлением плавающих чисел на машине. Потому что без этого ты никогда не поймёшь бредовость своей постановки задачи
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
15.10.2012, 16:48  [ТС]     double + cout #17
Evg,

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
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <sstream>
using namespace std;
 
void Out(double out, int prec)
{
    ostringstream oss;
    oss.precision(20);
    oss << out;
    string out_s = oss.str(), out_o;
    for(unsigned int j = 0; j < out_s.length(); ++j)
    {
        out_o += out_s[j];
 
        if(out_s[j] == '.')
        {
            for(unsigned int i = j+1; i < j + prec + 1 && i < out_s.length(); ++i)
            {
                out_o += out_s[i];
            }
            
            goto qwe;
        }
    }
 
    qwe:;
    cout << out_o;
}
 
 
int main()
{
    Out(48.7999999999999, 5);
 
    cout << "\n\n";
    system("pause");
    return 0;
}
Evg, бесконечная? ага.
Если это можно сделать самому, то разрабы стл тем более могли написать.

Добавлено через 1 минуту
Кстати, выведет 48.79999
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16845 / 5266 / 323
Регистрация: 30.03.2009
Сообщений: 14,172
Записей в блоге: 26
15.10.2012, 19:47     double + cout #18
Цитата Сообщение от Kgfq Посмотреть сообщение
Evg, бесконечная?
Господи, ну почему же ты не читаешь, что тебе пишут? В 8-й строке замени "20" на "30", а в 33-й - "5" на "30". И почему же в итоге число-то такое кривое выводится, совсем не такое, какое писал ты? Наверное, авторы stl ничего не умеют...

Цитата Сообщение от Kgfq Посмотреть сообщение
Если это можно сделать самому, то разрабы стл тем более могли написать
С какого перепугу им это надо было сделать? Они сделали честное округление при печати. Подрезание строки их никто делать не просил. Точно так их не просили включать в stl какую-нибудь реализацию калькулятора или табулирование функции (наверное, много студентов об этом мечтают)
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
16.10.2012, 23:07  [ТС]     double + cout #19
Evg, при чем тут студенты или нет?
Не округлять число в повседневной жизни тоже бывает нужно. Ты же не округляешь цену 50000,50
до 50001
и не говоришь каждый раз "пятьдесят копеек"
так вот и тут

и, кстати, я про адекватные точности говорю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2012, 23:48     double + cout
Еще ссылки по теме:

cout.setf и cout.precision C++
В чем разница std::cout и просто cout? C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16845 / 5266 / 323
Регистрация: 30.03.2009
Сообщений: 14,172
Записей в блоге: 26
16.10.2012, 23:48     double + cout #20
Если тебе нужно округлить до целого, то для этого есть специальные функции. Если тебе нужно округлить до стольких-то знаков после запятой, то такая задача не выполнима для встроенных плавающих типов (float, double, long double). О причинах сказано выше, причём не раз
Yandex
Объявления
16.10.2012, 23:48     double + cout
Ответ Создать тему
Опции темы

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