5 / 5 / 1
Регистрация: 04.07.2014
Сообщений: 73

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

22.10.2014, 14:40. Показов 3791. Ответов 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 / 1799 / 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 / 1799 / 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,876
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 / 1799 / 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 / 1799 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru