Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2009, 16:59   #1
Hanickii
Пользователь
 
Аватар для Hanickii
 
Регистрация: 08.09.2009
Сообщений: 28
Сообщение Вещественные

Доброго времени суток таварищи!

Значит возникло у меня несколько вопрос .

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

2.Не смог понять как правильно выводить переменные носящией в себе числа с плавающей запятой(на сколько я понимаю плавающая запятая имееться в виду обычные дробные?)

Вот например cout << "Среднее значение равно" << setprecision(2)
<< satiosflag (ios::fixed | ios::showpoint) << peremennaia << endl;

Обьясните плиз по подробней этот момент.
Hanickii вне форума Ответить с цитированием
Старый 16.09.2009, 19:06   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
1.В моём самоучителе написано что тип переменных с плавающей запятой не точный и его лучше не использовать, а для расчёта денег так и подавно. Не могу понять почему и какие тогда типы использовать чтобы оперировать с дробными.
Выкинь свой самоучитель. Это злобная ересь. Плаваящая точка повышает точность вычислений. Поэтому такие типы используются при высокоточном вычислении. Для денег это не требуется. А так как операции над типами с плавающей точкой медленнее операций над типами с точкой фиксированной, то их там использовать нецелесообразно.
mMAg вне форума Ответить с цитированием
Старый 17.09.2009, 10:29   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

1) Плавающая точка/запятая - это представление числа в стандартной форме (aka научной нотации): задаются отдельно первые значащие цифры, отдельно - порядок числа. Например, не 0.00012, а 1,2*10^-4 (1,2 умножить на 10 в степени -4). Потому и "плавающая точка", что первая значащая цифра может быть в любой позиции. Под словом float понимают как вообще подобное представление числа, так и конкретный тип переменной, занимающей 4 байта. Есть еще тип double, занимающий 8 байт, и дающий двойную точность и больший диапазон значений (у float это 10 в степени +/- 38, у double - в степени 308). Возможно, это ошибка переводчика, который не понял, что речь идет о типе переменной. Кстати, иногда float для определенности называют single (в противоположность double).

Общий совет - используй float, когда речь идет не о деньгах и не о моделировании физических процессов (в некоторых формулах физики полупроводников я видел выражение h^(-3), что равно 10e+100).

2) Если ты только начинаешь изучать C++, то формы
cout << "Среднее значение равно" << peremennaia << endl;
тебе хватит выше крыши. Когда понадобится изменить кол-во цифр после запятой, или как-то еще изменить способ вывода - обращайся к справочникам. Лично я предпочитаю Герберт Шилдт - "Самоучитель C++" (нихрена он не самоучитель, обычный справочник).

Последний раз редактировалось ds.Dante; 17.09.2009 в 10:42.
ds.Dante вне форума Ответить с цитированием
Старый 17.09.2009, 10:54   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Hanickii Посмотреть сообщение
1.В моём самоучителе написано что тип переменных с плавающей запятой не точный и его лучше не использовать, а для расчёта денег так и подавно. Не могу понять почему и какие тогда типы использовать чтобы оперировать с дробными.
Действительно, числа с плавающей запятой неточные. Они хранятся не так как целые и содержат погрешность. В общем случае: 1/3 != 2/6. Нельзя их сравнивать простым равенством, нужно учитывать погрешность.
1/3 может храниться как: 0.333333333332, а 2/6 как: 0.333333333334. А эти два числа не равны. Опять же 1/3 != (1/3)*2/2. Особенности вычислений чисел с плавающей точкой.
Если в float записать, например, 100 миллионов и потом к этому числу прибавить единицу, то так и останется 100 миллионов. Деньги в float и double лучше не хранить, а то потом копейки "улетать" в никуда будут. Надёжнее хранить к обычном int, __int64 в копейках, чтобы не было дробей. Уж пол копейки никак не получится
Цитата:
Сообщение от Hanickii Посмотреть сообщение
2.Не смог понять как правильно выводить переменные носящией в себе числа с плавающей запятой(на сколько я понимаю плавающая запятая имееться в виду обычные дробные?)

Вот например cout << "Среднее значение равно" << setprecision(2)
<< satiosflag (ios::fixed | ios::showpoint) << peremennaia << endl;

Обьясните плиз по подробней этот момент.
Что тут объяснять? В MSDN посмотрите что эти флаги все делают. setprecision(2), например, указывает, что выводим 2 знака после запятой.
setiosflag устанавливает флаги вывода.
ios::fixed - вещественное число выведется как число с фиксированной точкой, а не в виде: 1.33E10
ios::showpoint - выведется десятичная точка-разделитель целой и дробной частей
Как то вот так в общем
pu4koff вне форума Ответить с цитированием
Старый 17.09.2009, 13:28   #5
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Деньги в float и double лучше не хранить, а то потом копейки "улетать" в никуда будут. Надёжнее хранить к обычном int, __int64 в копейках, чтобы не было дробей. Уж пол копейки никак не получится
Обычно на компьютере деньги считают, ну, там, полпроцента добавить. Вот тут-то как раз чем выше точность дроби, тем лучше, для этого в C# добавили тип decimal. Кстати, первое в истории компьютерное правонарушение связано с тем, что программист сделал в банковской базе данных округление до центов в меньшую сторону, а разницу перечислял на свой счет.
ds.Dante вне форума Ответить с цитированием
Старый 17.09.2009, 16:13   #6
Hanickii
Пользователь
 
Аватар для Hanickii
 
Регистрация: 08.09.2009
Сообщений: 28
По умолчанию

Спасибо большое. Очень помогло. Единственное что осталься вопрос, а числа с фиксированой точкой также нужно использовать float, double?? А на счёт того что для денег использовать int, тоесть все деньги изображать в виде копеек например 2.55 = 255 копеек?

А и еще столкнулся с операцией :? что она делает?
Hanickii вне форума Ответить с цитированием
Старый 17.09.2009, 17:01   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Hanickii Посмотреть сообщение
Спасибо большое. Очень помогло. Единственное что осталься вопрос, а числа с фиксированой точкой также нужно использовать float, double??
float и double - это числа с плавающей точкой. Чисел с фиксированной точкой в языке нет, разве что самому их собирать или может где есть реализация.
Цитата:
Сообщение от Hanickii Посмотреть сообщение
А на счёт того что для денег использовать int, тоесть все деньги изображать в виде копеек например 2.55 = 255 копеек?
Ага. Ну а для вывода на экран уже 255 преобразовывать в 2.55, если нужно. Это конечно один из вариантов. Где-то лучше использовать другие методы. Зависит от задачи и сумм. Если там одни миллионы, то зачем хранить в копейках, когда можно хранить в миллионах
Цитата:
Сообщение от Hanickii Посмотреть сообщение
А и еще столкнулся с операцией :? что она делает?
а : b ? c;
если а, то b, иначе c.
int a = flag : 10 ? -10;
если flag истина, то a = 10, если же flag - ложь, то a = -10.
В общем, это краткая форма записи if/else.
pu4koff вне форума Ответить с цитированием
Старый 17.09.2009, 17:06   #8
Hanickii
Пользователь
 
Аватар для Hanickii
 
Регистрация: 08.09.2009
Сообщений: 28
По умолчанию

Спасибо за ообьяснение!
Hanickii вне форума Ответить с цитированием
Старый 17.09.2009, 17:43   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от pu4koff
а : b ? c;
если а, то b, иначе c.
int a = flag : 10 ? -10;
если flag истина, то a = 10, если же flag - ложь, то a = -10.
В общем, это краткая форма записи if/else.
Вы перепутали)) int a = flag ? 10 : -10;
netrino вне форума Ответить с цитированием
Старый 17.09.2009, 18:14   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Вы перепутали)) int a = flag ? 10 : -10;
Извиняюсь. Я этой операцией прост уже миллион лет не пользовался, в каком порядке ТС их написал, так я и намалевал
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имеется список,элементами которого являются вещественные числа.Создать консольное приложение,описывающее Smart Помощь студентам 1 06.05.2008 08:09