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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
ymniktm
4 / 4 / 1
Регистрация: 04.07.2014
Сообщений: 65
#1

В поисках логики - C++

22.10.2014, 14:40. Просмотров 1442. Ответов 41
Метки нет (Все метки)

Проблема известная но окончательного ответа я так и не нашел...

int a,b;
a=(0.1+0.7)*10;
b=(0.1+0.8)*10;
cout << a << ' ' <<b;
// 7 9
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2014, 14:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В поисках логики (C++):

В поисках адреса переменной - Visual C++
Здравствуйте. Вот дали задачки к экзамену, третий день ищу решение никак найти не могу. Подскажите пожалуйста если не сложно. Vusial C++...

В поисках хэндла приложения по имени - C++ WinAPI
Привет всем! Помогите разобраться. Почему такой вод код не помогает найти хэндл программы &quot;DoCtrl&quot;? Возвращается NULL. HWND HForm1; ...

В поисках книги - C++
Брюс Эккель философия с++ 4е издание.

В поисках совершенных абстракций - C++
Для C++ существует огромное множество библиотек выполненных в различных техниках исполнения. Программисты создавшие их следовали разным...

В поисках элегантного кода - C++
Всем привет! У меня есть вот такая функция: void Magic2(int condition, int x, int y, int negY, float k, float b, int* pdc, int width) { ...

Создайте функцию, которая просматривает массив из 10 целых чисел в поисках одинаковых значений. Все найденн - C++
Создайте функцию, которая просматривает массив из 10 целых чисел в поисках одинаковых значений. Все найденные пары программа должна...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
22.10.2014, 21:28 #31
Цитата Сообщение от RefSol Посмотреть сообщение
присваивается естественно не тип, а данные
Цитата Сообщение от RefSol Посмотреть сообщение
должно быть явным
Это не противоречит тому что процесс вычисления будет лежать в разрядности float или double, что и предусматривает пробразователь типа. А присвоение само округлит уже результат до int. Пример:
C++
1
2
3
int a;
float b=0.7;
a=b
0
RefSol
240 / 179 / 42
Регистрация: 31.10.2010
Сообщений: 558
22.10.2014, 21:31 #32
Izual,
Цитата Сообщение от Izual Посмотреть сообщение
Это не противоречит тому что процесс вычисления будет лежать в разрядности float или double, что и предусматривает пробразователь типа. А присвоение само округлит уже результат до int.
, это "уступки" компилятора, преобразование типов (по стандарту языка) должно быть явным в C и C++.
Если игнорировать замечания о подобных преобразованиях типов в С и С++ то стиль и качество программ не улучшится.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
22.10.2014, 21:38 #33
Цитата Сообщение от RefSol Посмотреть сообщение
то стиль и качество программ не улучшится
Стиль как и мода(мало ли что принято, от того что время идёт вперёд не следует что этические принципы так же улучшаются) меня мало волнуют, волнует качество. А то как компилятор "съедает" - это и есть искомый вопрос, если он может съесть и не навредить качеству - то почему бы и не сделать? Нужен либо пример того что будет не правильный результат, либо какие то доказательства того что качество ухудшится.
0
RefSol
240 / 179 / 42
Регистрация: 31.10.2010
Сообщений: 558
22.10.2014, 21:51 #34
Цитата Сообщение от Izual Посмотреть сообщение
Нужен либо пример того что будет не правильный результат, либо какие то доказательства того что качество ухудшится
, пример есть в начале темы
А в остальном дело вкуса и желаемого результата.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
22.10.2014, 22:32 #35
Цитата Сообщение от RefSol Посмотреть сообщение
пример есть в начале темы
В начале темы нет объяснения и примера того что конструкцию с приведением типа
C++
1
a=(float)(0.1+0.7)*10;
не правильно использовать. Вы сказали что это не правильно. Т.к. разумного пояснения нет, а довод лишь сугубо догматичен взглядом "бабка сказала" - то это не аргумент.
0
RefSol
240 / 179 / 42
Регистрация: 31.10.2010
Сообщений: 558
22.10.2014, 22:38 #36
Цитата Сообщение от Izual Посмотреть сообщение
не правильно использовать. Вы сказали что это не правильно. Т.к. разумного пояснения нет, а довод лишь сугубо догматичен взглядом "бабка сказала" - то это не аргумент.
,
аргументом и доказательством неправильности подобных конструкций является различные результаты строк:

C++
1
a=(float)(0.1+0.7)*10;
и

C++
1
a = (int)(((float)0.1 + (float)0.7) * (float)10.0);
Благодарю, за беседу
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
22.10.2014, 23:02 #37
Цитата Сообщение от RefSol Посмотреть сообщение
является различные результаты строк
Результат что там, что тут "8".
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.10.2014, 06:56 #38
Цитата Сообщение от Izual Посмотреть сообщение
В смысле "присваивается тип"? Он же не может присвоиться(!?), зато использование преобразователя ведёт к вычислению по дробным правилам, включающим правило округления.
Бред. Дроби у тебя уже были и с ними всё и вычислялось по дробным правилам, поэтому без "математического" округления, а только с тем округлением, которое продиктовано разрядностью типа double, ты просто ещё раз привёл результат к дроби.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.10.2014, 07:05 #39
taras atavin, ну возьми и сам сравни результат:
C++
1
2
3
INT a=(float)(0.1+0.7)*10;
//и
INT a=(0.1+0.7)*10;
Или между 7 и 8 в результате разницы нет?.. ~ ~
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.10.2014, 07:24 #40
Цитата Сообщение от Izual Посмотреть сообщение
taras atavin, ну возьми и сам сравни результат:
Код C++
1
2
3
INT a=(float)(0.1+0.7)*10;
//и
INT a=(0.1+0.7)*10;
Сравни сам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a;
int b;
int c;
int d;
int e;
int f;
int g;
a=((float)0.1+(float)0.7)*(float)10.0;
b=(float)((float)0.1+(float)0.7)*(float)10.0;
c=(float)(0.1+0.7)*10.0;
d=((double)0.1+(double)0.7)*(double)10.0;
e=(double)((double)0.1+(double)0.7)*(double)10.0;
f=(double)(0.1+0.7)*10.0;
g=(0.1+0.7)*10.0;
std::cout<<"a="<<a<<", b="<<b<<", c="<<c<<", d="<<d<<", e="<<e<<", f="<<f<<", g="<<g;
. Последние два равны, в третьей и последней округляется не по правилам double только результат, но в третьей дважды по разным правилам: при приведении к float целая часть не выделяется.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.10.2014, 08:40 #41
Результат твоего примера: 8, 8, 8, 7, 7, 7, 7, 7.
Почему все double показывают 7, а не 8?.. Ведь double дробный тип.. Значит double не применяет >0.5 логику?
Цитата Сообщение от taras atavin Посмотреть сообщение
в третьей и последней округляется не по правилам double только результат
Какое это "правило double", если оно не округляет вообще..
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.10.2014, 08:46 #42
Цитата Сообщение от Izual Посмотреть сообщение
Результат твоего примера: 8, 8, 8, 7, 7, 7, 7, 7.
Почему все double показывают 7, а не 8?.. Ведь double дробный тип.. Значит double не применяет >0.5 логику?
Дело не в этом.
C++
1
2
int a;
a=(double)((long double)0.1+(long double)0.7)*(long double)10.0;
. Эту логику не к чему применять, тех цифр просто нет. А вот при приведении к дроби меньшей разрядности уже работает округление. И если один раз результат округлить вверх, то дальше всегда будет получаться 0.8.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2014, 08:46
Привет! Вот еще темы с ответами:

Алгебра логики - C++
Друзья можете подсказать какую-нибудь программу на задачу алгебра логики

Упрощение выражений алгебры логики - C++
Я пытаюсь написать программу для упрощение выражений алгебры логики.Не могу придумать алгоритм для упрощения.Может кто нибудь уже...

Разделение данных и логики и ООП - C++
Тренируюсь в ООП и вообще в C++ и появилась неприятная ошибка. Есть конструктор в классе BaseHouse: BaseHouse(unsigned int height,...

Решение задач логики предикатов - C++
Всем привет. Вот уже неделю обдумываю идею написания программы решения задач логики предикатов (конечно самых простых). Знаю, что задача не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.10.2014, 08:46
Ответ Создать тему
Опции темы

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