|
5 / 5 / 1
Регистрация: 04.07.2014
Сообщений: 73
|
|
В поисках логики22.10.2014, 14:40. Показов 3443. Ответов 41
Метки нет (Все метки)
Проблема известная но окончательного ответа я так и не нашел...
int a,b; a=(0.1+0.7)*10; b=(0.1+0.8)*10; cout << a << ' ' <<b; // 7 9
0
|
|
| 22.10.2014, 14:40 | |
|
Ответы с готовыми решениями:
41
Борьба с padding. В поисках логики В поисках AV Проверить истинность формулы логики предикатов. Формулы логики предикатов. Область истинности формулы |
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
| 22.10.2014, 17:25 | ||||||
0
|
||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 22.10.2014, 17:57 | |
|
Проблема в точности. Идеально точно десятичные дроби в double не помещаются (ну кроме совсем удачных, вроде 0.5), поэтому возникают малюсенькие "подвижки" в числах и в результате вычислений мы получаем чуть-чуть поменьше 0.8 и чуть-чуть побольше 0.9. Для получения предсказуемых результатов нужно выбрать правило округления и пользоваться им. По умолчанию при преобразовании в int попросту отбрасывается дробная часть. Можно пользоваться бухгалтерским округлением, добавляя 0.5 к округляемому значению перед отбрасыванием дробной части.
0
|
|
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||
| 22.10.2014, 18:14 | ||
|
0
|
||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|||
| 22.10.2014, 18:59 | |||
|
После отбрасывания дробной части, которое осуществляется при занесении значения в переменную a, имеющую тип int, остаётся 7.
0
|
|||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 22.10.2014, 19:03 | |||
|
0
|
|||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 22.10.2014, 19:07 | |
|
Потому что "закон округления" при преобразовании из вещественных чисел в целые выбран однозначно: отбрасывается дробная часть, остаётся целая. Если нужно округление по каким-то другим правилам - извольте считать самостоятельно, к вашим услугам floor, ceil и прочие интересные функции.
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||
| 22.10.2014, 19:08 | ||
|
7 и не важно, что 0,99999999999999999999999(9) практически 1 отбросили у компьютера башка железная, так глубоко мыслить не может ![]() чтобы такого не было можно сделать так a=(0.1+0.7+0.05)*10; b=(0.1+0.8+0.05)*10; у Evg в блогах хорошо описано это поведение, потеря точности, накопление ошибок если нужна точность то не надо пользоваться плавающими например в Бух Учете, там эти округления могут довести до того, что всю бухгалтерию посадят
0
|
||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
| 22.10.2014, 19:10 | ||||||
|
Так, протестировал:
0
|
||||||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||
| 22.10.2014, 19:24 | ||
|
есть и отбрасывание дроби пример из жизни кофе, в автомате, стоит 20 рублей, у тебя 19.99 кофе не получишь ![]() почему говорю "в автомате"? продавщицу уболтать можно, сработает математическое округление ![]() "Женщину вынули, автомат вставили"(с) "Кин-дза-дза"
0
|
||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 22.10.2014, 19:34 | |||
|
Вы тут разводите демогогию не имеющую отношения к логие задачи, а тема называется "ПОИСК ЛОГИКИ", т.е. автору интересен сам факт того почему его пример не работает так, как мы отталкиваемся от общепринятого. Я показал - логику, а вы показываете брехню, не имеющую отношения к искомой проблеме. По этому прекращяйте следствия показывать, автор ищет причину!
0
|
|||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|||||||
| 22.10.2014, 19:43 | |||||||
|
вот и сам блог
https://www.cyberforum.ru/blogs/18334/blog88.html по моему, очень понятно, почему происходит потеря точности кстати не компьютерный пример, который может объяснить многое 1/3*3 =1 но стоит только перевести в десятичную дробь 1/3=0.3333333333333333(3)*3=0.999999999999 999999999(9) единицы не получается ![]() компьютер оперирует двоичными числами и многие десятичные конечные дроби для него являются бесконечными а размер конечен, вот тебе и потеря хорошо он оперирует с дробями вида1/2n Добавлено через 6 минут достаточно литературу почитать, что есть конечная и бесконечная дробь независимо какая она была и это не только в Си Добавлено через 1 минуту
0
|
|||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
| 22.10.2014, 19:57 | ||||||
|
"Краткость - сестра таланта". И не надо тут про движение нейтронов, фатонов и другой чепухи, отводящей от конкретики, в чём я не сомневаюсь вы преуспеете если будете и дальше углубляться в процессы вычислений, зависящих от типа, зависящих от кол-ва чисел, зависящих от разрядности, зависящих от движения электронов, и т.п... кармические реакции.. ![]() Добавлено через 4 минуты ![]()
0
|
||||||
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
| 22.10.2014, 20:07 | |
|
0
|
|
| 22.10.2014, 20:22 | |
|
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 22.10.2014, 20:32 | ||
|
0.00011001? Или 0.0001100110011? Или сколько? Где ни остановись, а получается меньше, чем 0.1 десятичное. А 0.7 десятичное - это сколько в двоичном? 0.10110011? Или 0.1011001100110? Это тоже меньше, чем 0.7 десятичное. Сумма тоже получается меньше, чем 0.8 десятичное. 0.00011001+0.10110011=0.11001100. Переведём в десятичное. 0,796875<0.8. А теперь переведём 0.8 десятичное в двоичное. 0.11001100. Совпадает. 0.0001100110011+0.1011001100110=0.110011 0011001. Переведём в десятичное. 0.799926758. Тоже меньше. Переведём 0.8 десятичное в двоичный формат. 0.1100110011001. Тоже совпадает. А теперь сложим ещё раз. 0.00011001+0.11001100=0.11100110. В десятичном 0.89453125. Переведём 0.9. 0.11100110. Совпадает. 0.0001100110011+0.1100110011001=0.111001 1001100. В десятичном 0.899902344. Переведём 0.9. 0.1110011001100. Опять совпадает. Теперь умножим на 1010. 0.11001100*1010=110.11111000. При округлении получается 110, переведём в десятичное и получим 6. 0.11100110*1010=1000.11111100, при округлении получаем 1000, при переводе получаем 8. Но заковыка может крыться в том, как округлены дроби. Округлим 0.00011001, 0.11001100 и 0.11100110 до 5-го разряда после запятой, учитывая два разряда после запятой: 0.00011001= 0.00011, 0.11001100=0.11001, а 0.11100110=0.11101. Первый две дроби уменьшились, а третья увеличилась. Умножим третье значение ещё раз на 1010. Получается 0.11101*1010=1001.00010, при округлении до целых получается 1001, переведём в десятичное и получим 9. Переведём 0.11101 в десятичный формат и получим 0.90625. Одна и так же ошибка сработала в две разные стороны.
0
|
||
|
5 / 5 / 1
Регистрация: 04.07.2014
Сообщений: 73
|
|
| 22.10.2014, 20:33 [ТС] | |
|
Всё это писали и на других форумах. Вопрос в другом.
почему (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 ?
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 22.10.2014, 20:36 | ||
|
0
|
||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|
| 22.10.2014, 20:37 | |
|
0
|
|
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||
| 22.10.2014, 20:41 | ||
|
Добавлено через 2 минуты taras atavin, вася, дочитай до конца пост, корень проблемы в return INT типе. Ещё бисера метнуть?
0
|
||
| 22.10.2014, 20:41 | |
|
Помогаю со студенческими работами здесь
20
В поисках библиотеки
Помогите в поисках в поисках истины.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|