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

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

22.10.2014, 14:40. Показов 3552. Ответов 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,874
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
Ответ Создать тему
Новые блоги и статьи
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru