Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/104: Рейтинг темы: голосов - 104, средняя оценка - 4.51
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408

double + cout

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

Студворк — интернет-сервис помощи студентам
Через cout вывожу double.

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

Как сделать, что бы не округляло?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2012, 15:42
Ответы с готовыми решениями:

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

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

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

27
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:02  [ТС]
Студворк — интернет-сервис помощи студентам
Evg, я же выполнил, значит выполнима
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.10.2012, 00:16
Ты не выполнил. Ты напечатал с округлением, но не округлил. То бишь получил строковое представление с округлением, но не величину, которую можно будет использовать в вычислениях. Потому что у тебя при вычислениях на машине будет лишний хвост, которого не должно быть в реальности при вычислении на бумаге

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main (void)
{
  double a =  48.7999999;
  double b = a * 10000000.0;
  std::cout << std::fixed << std::setprecision(20) << b << std::endl;
  return 0;
}
Bash
487999999.00000005960464477539
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:18  [ТС]
Evg, зачем мне вычисления. Мне нужно было лишь ВЫВЕСТИ на экран.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.10.2012, 01:06
Твой исходный вопрос звучал как "Как вывести число с исходной точностью, но не округляя его?" Тебе ответили, что никак. Потому что число, которое в десятичной системе пишется "48.799999999999997", в двоичной системе записывается в виде бесконечной непериодической записи. В машине представление конечное, а потому бесконечная двоичная запись обрезается и то число, что хранится в машине уже перестаёт в точности совпадать с тем, что ты написал в тексте программы. А потому в машине физически нету числа с "исходной точностью", а потому задача невыполнимая. Ты его можешь напечатать с точностью до стольких-то знаков после запятой
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 23:00  [ТС]
Evg, исходная точность cout - 6 знаков после запятой. Так что это ты не понял вопроса.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.10.2012, 23:59
Цитата Сообщение от Kgfq Посмотреть сообщение
исходная точность cout - 6 знаков после запятой
Это не исходная точность, а дефолтное округление, что как бэ не одно и то же

Цитата Сообщение от Kgfq Посмотреть сообщение
Так что это ты не понял вопроса
Однако упёртый ты товарищ. Возьмём следующий пример. На всякий случай сообщаю, что таким образом распечатывается байтовый образ плавающего числа, хранимого в машине.

C++
#include <iostream>
 
int main (void)
{
  double a = 48.799999999999997;
  double b = 48.799999999999998;
  
  std::cout << std::hex << *((long long*)&a) << std::endl;
  std::cout << std::hex << *((long long*)&b) << std::endl;
  
  return 0;
}
Bash
4048666666666666
4048666666666666
Как видишь, для двух как бы разных плавающих чисел мы видим один и тот же байтовый образ. Т.е. машина не различает эти два плавающих числа. Внимание, вопрос. При печати машина получает 8-байтовый образ числа. Как машина должна догадаться, нужно напечатать "48.799999999999997", "48.799999999999998" или ещё одну из миллиардов разных возможных вещественных величин, которые при переводе в машинное двоичное представление дадут один и то же набор байтов

Добавлено через 17 минут
Если всё-таки я и вправду туплю и тебя интересует ответ на вопрос:

Цитата Сообщение от Kgfq Посмотреть сообщение
Если это можно сделать самому, то разрабы стл тем более могли написать
То встречный вопрос: а почему и зачем они должны были это делать? Если поставить более гипертрофированный вопрос, то почему бы в std::cout не добавить печать, которая на основании поданной строки выделит третье слово и заменит в нём все буквы "a" на "б". Такая встроенная возможность была бы крайне удобна для студента Иванова, которому преподаватель Петров задал вопрос N5 из билета N32.
0
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
18.10.2012, 00:42  [ТС]
Evg, печать без округления бывает полезна. Поэтому вполне логично было бы, если бы ее добавили в стл. Ведь добавили же самые разные вещи.

Впрочем, это уже философский спор. Я понял суть.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.10.2012, 09:02
Цитата Сообщение от Kgfq Посмотреть сообщение
печать без округления бывает полезна
Многое что бывает полезно. В Си++ добавили в первую очередь исходя из того, что подобная функциональность (возможно, избыточная) была в Си. А избыточность функциональности printf'а в первую очередь диктовалась требованиями производительности: язык-то придумывали в те времена, когда машины были медленные, а памяти было мало

Нигде при печати ведь нету округления целых чисел, ибо к процедуре печати это не имеет никакого отношения. А вот округление плавающих чисел - это не просто дополнительная функциональность и не пижонский набор велосипедов, это просто реальная необходимость, обусловленная тем, что плавающие числа изначально представляются неточно и печать почти любого плавающего числа помимо печати "неправильного" значения будет иметь ещё и очень длинную запись. Поэтому округление при печати пришлось вводить ещё в языке Си (в printf), а затем и в Си++ (в std::cout)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2012, 09:02

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Cout <<endl; Что это значит? Если ничего нету в cout?
Здравствуйте ! Обьясните пожалуйста что значит cout &lt;&lt;endl; если он используется после цикла for?

Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout
Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout. Это фрагмент со структурами: ...

Разница между fwrite, cout и cout.write
Привет. Пытаюсь вывести букву 'ф' в консоль Windows 7, используя кодировку UTF-8. Для этого меняю кодовую страницу консоли на CP_UTF8,...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru