Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
5 / 5 / 1
Регистрация: 04.07.2014
Сообщений: 73

В поисках логики

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

Студворк — интернет-сервис помощи студентам
Проблема известная но окончательного ответа я так и не нашел...

int a,b;
a=(0.1+0.7)*10;
b=(0.1+0.8)*10;
cout << a << ' ' <<b;
// 7 9
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2014, 14:40
Ответы с готовыми решениями:

Борьба с padding. В поисках логики
Доброго времени суток, господа. Кто мне может объяснить, почему при применении свойства padding к блоку, его размер увеличивается. ...

В поисках AV
Доброго времени суток ув. форумчане. Пожалуй сначала опишу всю структуру ... Гхм. Собственно: Есть две таблицы , одна является...

Проверить истинность формулы логики предикатов. Формулы логики предикатов. Область истинности формулы
Помогите решить задания.Объясните как делать хотя бы первые 2.Или хотя бы укажите источник,благодаря которому получится решить данные...

41
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.10.2014, 20:46
Студворк — интернет-сервис помощи студентам
Ты совсем? Если бы приводилось точно представимое, например, (0.5+0)*10, то получилось бы правильно:
0.5 десятичное=0.1 двоичное, 0.1*1010=101.0, округляем и получаем 101 двоичное, переводим в десятичное и получаем 5.
0
22.10.2014, 20:47

Не по теме:

Цитата Сообщение от Izual Посмотреть сообщение
количество голосов же решает в демократии, да Dennis Ritchie?
Я предполагал, что вы именно так (подобное) и напишите. Значит, вам нужно лучше познать Бога C++ :D
Если вам интересно, то знайте, что количество голосов не имеет для меня никакого значения. Просто объективное мнение.

0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
22.10.2014, 20:53
Izual, не совсем так
Цитата Сообщение от Izual Посмотреть сообщение
a=(0.1+0.71)*10;
вот так:

C++
1
2
3
int a,b;
a = (int)(((float)0.1 + (float)0.7) * (float)10.0);
b = (int)(((float)0.1 + (float)0.8) * (float)10.0);
или так

C++
1
2
3
4
5
6
int a,b;
float af, bf;
af = (0.1+0.7)*10.0;
bf = (0.1+0.8)*10.0;
a = (int) af;
b = (int) bf;
а лучше (оптимальнее) так:

C++
1
2
int a = 8;
int b = 9;
Добавлено через 2 минуты
ymniktm, посмотрите стандарт IEEE (ANSI/IEEE Std. 754-1985),
там написано, почему
Цитата Сообщение от ymniktm Посмотреть сообщение
Вопрос в другом.
почему (0.1+0.8)*10=9.0000000001,(0.1+0.6)*10=7 .00000000001,(0.2+0.7)*10=9,000000000000 1 и тп
а (0.1+0.7)*10=7.99999999999 ?
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 21:03

Не по теме:

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
нужно лучше познать Бога C++
Я бы написал иначе: "бога в С++", и С++ лишь как действие, относительно этого:
Они пребывая в своём заблужденье,
Деянием в йоге(связь) придут к просветленью.
(с БГ)
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я предполагал, что вы именно так (подобное) и напишите.
Значит специально спровоцировали.. ~ ~
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Если вам интересно
О вас уже мнение сформированно, уже не интересно.



taras atavin, ох, как с вами сложно, "будете смотреть и не увидите"... Я указал на то что проблема в том, что при использовании INT при вычислении будет результат, отталкивающийся от разрядности, в чём в общем и финал решения проблемы автора. Ещё бисерку? Такое ощущение что троллей кормлю, пора заканчивать этот процесс, а то совсем толстыми станете..

Добавлено через 1 минуту
RefSol, а так?
C++
1
a=(float)(0.1+0.7)*10;
0
5 / 5 / 1
Регистрация: 04.07.2014
Сообщений: 73
22.10.2014, 21:06  [ТС]
ValeryS, у всех double чисел есть два варианта представления "чуть больше" и "чуть мненьше".
Если дело в битах то почему нет аналогичной ошибки у (0.1+0.3)*10 ?
Или если следовать рассуждениям taras atavin почему например (int)((0.1+0.1)*10)=2 и (int)((0.7+0.7)*10)=14
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.10.2014, 21:08
Цитата Сообщение от Izual Посмотреть сообщение
taras atavin, ох, как с вами сложно, "будете смотреть и не увидите"... Я указал на то что проблема в том, что при использовании INT при вычислении будет результат, отталкивающийся от разрядности, в чём в общем и финал решения проблемы автора. Ещё бисерку? Такое ощущение что троллей кормлю, пора заканчивать этот процесс, а то совсем толстыми станете..
Не имеет значение, каким образом Вы выведет целую часть, если число получилось меньше 0.8, но не меньше 0.7, то будет выведено 0.7. Проблема в том, что из-за ошибок округления при разборе операндов и вычислении получено меньше 0.8. Когда этих ошибок нет, то результат правильный, хоть к инту приводите, хоть функцию юзайте, лезущую прямо в низкоуровневую дробь, выделяющую целую часть, но возвращающую её в формате плавающей запятой. Это значения не имеет.

Добавлено через 1 минуту
Цитата Сообщение от ymniktm Посмотреть сообщение
Если дело в битах то почему нет аналогичной ошибки у (0.1+0.3)*10 ?
Или если следовать рассуждениям taras atavin почему например (int)((0.1+0.1)*10)=2 и (int)((0.7+0.7)*10)=14
А Вы проанализируйте, какие двоичные числа складываются и умножаются и в какую сторону при этом происходит ошибка округления.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
22.10.2014, 21:09
Цитата Сообщение от ymniktm Посмотреть сообщение
ValeryS, у всех double чисел есть два варианта представления "чуть больше" и "чуть мненьше".
покажь
лучше на примере из стандарта, ссылку на который дал RefSol,
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
22.10.2014, 21:15
Izual,
Цитата Сообщение от Izual Посмотреть сообщение
a=(float)(0.1+0.7)*10;
,
так не верно потому, что тип a (int), т.е. перемененной типа int присваивается float,
в С и С++ преобразование типов должно быть явным.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 21:18

Не по теме:

Я уже вошёл во вкус)))
:smoke: :popcorn:
Походу я был прав, и скоро разговор дойдёт до разбора атомов)))



Добавлено через 2 минуты
Цитата Сообщение от RefSol Посмотреть сообщение
так не верно потому, что тип a (int), т.е. перемененной типа int присваивается float
В смысле "присваивается тип"? Он же не может присвоиться(!?), зато использование преобразователя ведёт к вычислению по дробным правилам, включающим правило округления.

Добавлено через 49 секунд
А уже после вычисления результат (float) вида будете округлён в int явный тип... По логике..
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
22.10.2014, 21:26
Вот описание стандарта на русском

Добавлено через 1 минуту
Цитата Сообщение от Izual Посмотреть сообщение
В смысле "присваивается тип"? Он же не может присвоиться(!?),
присваивается естественно не тип, а данные, оператор (=) - это оператор присваивания,
а преобразование типов (по стандарту языка) должно быть явным в C и C++

Добавлено через 2 минуты
т.е. например
C++
1
2
3
4
5
float af 5.25;
double ad;
 
ad = (double)af; // правильно
ad = af;            // не правильно (скорее всего компилятор съест но выдаст сообщение)
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 21:28
Цитата Сообщение от RefSol Посмотреть сообщение
присваивается естественно не тип, а данные
Цитата Сообщение от RefSol Посмотреть сообщение
должно быть явным
Это не противоречит тому что процесс вычисления будет лежать в разрядности float или double, что и предусматривает пробразователь типа. А присвоение само округлит уже результат до int. Пример:
C++
1
2
3
int a;
float b=0.7;
a=b
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
22.10.2014, 21:31
Izual,
Цитата Сообщение от Izual Посмотреть сообщение
Это не противоречит тому что процесс вычисления будет лежать в разрядности float или double, что и предусматривает пробразователь типа. А присвоение само округлит уже результат до int.
, это "уступки" компилятора, преобразование типов (по стандарту языка) должно быть явным в C и C++.
Если игнорировать замечания о подобных преобразованиях типов в С и С++ то стиль и качество программ не улучшится.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 21:38
Цитата Сообщение от RefSol Посмотреть сообщение
то стиль и качество программ не улучшится
Стиль как и мода(мало ли что принято, от того что время идёт вперёд не следует что этические принципы так же улучшаются) меня мало волнуют, волнует качество. А то как компилятор "съедает" - это и есть искомый вопрос, если он может съесть и не навредить качеству - то почему бы и не сделать? Нужен либо пример того что будет не правильный результат, либо какие то доказательства того что качество ухудшится.
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
22.10.2014, 21:51
Цитата Сообщение от Izual Посмотреть сообщение
Нужен либо пример того что будет не правильный результат, либо какие то доказательства того что качество ухудшится
, пример есть в начале темы
А в остальном дело вкуса и желаемого результата.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 22:32
Цитата Сообщение от RefSol Посмотреть сообщение
пример есть в начале темы
В начале темы нет объяснения и примера того что конструкцию с приведением типа
C++
1
a=(float)(0.1+0.7)*10;
не правильно использовать. Вы сказали что это не правильно. Т.к. разумного пояснения нет, а довод лишь сугубо догматичен взглядом "бабка сказала" - то это не аргумент.
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
22.10.2014, 22:38
Цитата Сообщение от 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
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
22.10.2014, 23:02
Цитата Сообщение от RefSol Посмотреть сообщение
является различные результаты строк
Результат что там, что тут "8".
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.10.2014, 06:56
Цитата Сообщение от Izual Посмотреть сообщение
В смысле "присваивается тип"? Он же не может присвоиться(!?), зато использование преобразователя ведёт к вычислению по дробным правилам, включающим правило округления.
Бред. Дроби у тебя уже были и с ними всё и вычислялось по дробным правилам, поэтому без "математического" округления, а только с тем округлением, которое продиктовано разрядностью типа double, ты просто ещё раз привёл результат к дроби.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.10.2014, 07:05
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
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.10.2014, 07:24
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2014, 07:24

В поисках библиотеки
Я хочу написать игру, которую кратко можно описать как &quot;подрывник&quot; :). Работать я собираюсь следующим образом: есть массив вещественных...

В поисках видеокарты
Всем привет, мне нужно заменить видеокарту, для игрулек, посоветуйте, пожалуйста. =CPU= QuadCore AMD Phenom II X4 B25, 3100 MHz ...

Помогите в поисках
Есть необходимость собрать устройство для управления школьными звонками на микроконтроллере. Принцип такой, устройство должно иметь часы,...

в поисках истины.
Добрый день, господа. Короче говоря, меня чуть не выгнали с физфака но помиловали и теперь мне нужно адаптироваться;) - нужно написать 2...

В поисках скрипта
Приветствую всех! Помогите пожалуйста найти Javasciprt который будет осуществлять передвижение содержимого блока вправо или влево по...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru