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

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

22.10.2014, 14:40. Показов 3404. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru