Форум программистов, компьютерный форум 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.

Как сделать, что бы не округляло?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:02  [ТС]     double + cout #21
Evg, я же выполнил, значит выполнима
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
17.10.2012, 00:16     double + cout #22
Ты не выполнил. Ты напечатал с округлением, но не округлил. То бишь получил строковое представление с округлением, но не величину, которую можно будет использовать в вычислениях. Потому что у тебя при вычислениях на машине будет лишний хвост, которого не должно быть в реальности при вычислении на бумаге

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
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 00:18  [ТС]     double + cout #23
Evg, зачем мне вычисления. Мне нужно было лишь ВЫВЕСТИ на экран.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
17.10.2012, 01:06     double + cout #24
Твой исходный вопрос звучал как "Как вывести число с исходной точностью, но не округляя его?" Тебе ответили, что никак. Потому что число, которое в десятичной системе пишется "48.799999999999997", в двоичной системе записывается в виде бесконечной непериодической записи. В машине представление конечное, а потому бесконечная двоичная запись обрезается и то число, что хранится в машине уже перестаёт в точности совпадать с тем, что ты написал в тексте программы. А потому в машине физически нету числа с "исходной точностью", а потому задача невыполнимая. Ты его можешь напечатать с точностью до стольких-то знаков после запятой
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
17.10.2012, 23:00  [ТС]     double + cout #25
Evg, исходная точность cout - 6 знаков после запятой. Так что это ты не понял вопроса.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
17.10.2012, 23:59     double + cout #26
Цитата Сообщение от 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.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
18.10.2012, 00:42  [ТС]     double + cout #27
Evg, печать без округления бывает полезна. Поэтому вполне логично было бы, если бы ее добавили в стл. Ведь добавили же самые разные вещи.

Впрочем, это уже философский спор. Я понял суть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2012, 09:02     double + cout
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
18.10.2012, 09:02     double + cout #28
Цитата Сообщение от Kgfq Посмотреть сообщение
печать без округления бывает полезна
Многое что бывает полезно. В Си++ добавили в первую очередь исходя из того, что подобная функциональность (возможно, избыточная) была в Си. А избыточность функциональности printf'а в первую очередь диктовалась требованиями производительности: язык-то придумывали в те времена, когда машины были медленные, а памяти было мало

Нигде при печати ведь нету округления целых чисел, ибо к процедуре печати это не имеет никакого отношения. А вот округление плавающих чисел - это не просто дополнительная функциональность и не пижонский набор велосипедов, это просто реальная необходимость, обусловленная тем, что плавающие числа изначально представляются неточно и печать почти любого плавающего числа помимо печати "неправильного" значения будет иметь ещё и очень длинную запись. Поэтому округление при печати пришлось вводить ещё в языке Си (в printf), а затем и в Си++ (в std::cout)
Yandex
Объявления
18.10.2012, 09:02     double + cout
Ответ Создать тему
Опции темы

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