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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.62
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

double + cout - C++

14.10.2012, 15:42. Просмотров 2969. Ответов 27
Метки нет (Все метки)

Через cout вывожу double.

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

Как сделать, что бы не округляло?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 15:42     double + cout
Посмотрите здесь:

cout (double) - C++
Всем привет! Подскажите плз как вывести число типа дабл при помощи cout так чтобы были видны столько знаков, сколько я захочу а не 6...

double a=1/2; cout<<a;(a=0) что не так? - C++
#include &lt;iostream&gt; using namespace std; void main() { double a=1/2; cout&lt;&lt;a; } выводит a=0; использую 2008 студию....

Неправильно работает cout для чисел типа double и float - C++
Здравствуйте. Скажите, почему эта программа выводит на экран число 2, а не 2.5 ? #include &lt;iostream.h&gt; int main() { double...

typedef double (*d)(double); - C++
//--------------------------------------------------------------------------- #include &quot;math.h&quot; #include &lt;stdio.h&gt; #include...

Перевод double to double - C++
Всем привет! проблема такая : Есть вектор типа double. Из него надо считать число в переменную, которая тоже имеет тип double. Считываю...

new cout - C++
Как создать свой объект-аналог cout?

[C++] cout От A до Z и от 0 до 9 - C++
Атач - задание, Задание из книжки Бьярна Страуструпа Вот что знаю: // TBIKC.cpp: определяет точку входа для консольного приложения. ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
doctor_lecter
280 / 153 / 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
1480 / 1056 / 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
~ Эврика! ~
1243 / 992 / 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
~ Эврика! ~
1243 / 992 / 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
~ Эврика! ~
1243 / 992 / 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
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 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
~ Эврика! ~
1243 / 992 / 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
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 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
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 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
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 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 - C++
for(i=1;i&lt;=n;i++) cout&lt;&lt;'|'&lt;&lt;left&lt;&lt;internal&lt;&lt;ex; что здесь ни то

cout - C++
Если есть std::cout, то должен быть и просто cout. Есть ли он? И если есть, в чем отличия? А если нету, то зачем нужно было пространство...

cout - C++
Всем привет! В С++ не силён особо, такой вопрос. Дан массив, все элементы, которые больше 10, заменить на их квадратный корень. Это ок...

cout << . << . << - C++
почему cout начинает преобразовывать переменные с конца а выводить с начала ?? т.е. cout &lt;&lt; &quot;What is your name and how old are...

Неработающий cout - C++
Не выводит значения mass1 и mass2, помогите разобраться #include &lt;iostream&gt; using namespace std; int main() { int...


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

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

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