|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
|
Каков принцип округления дробных чисел у компьютера/компилятора?25.07.2018, 23:01. Показов 8836. Ответов 88
Метки нет (Все метки)
Всем привет.
У меня тут такой вопрос для темы: Как именно осуществляется округление дробных чисел в компьютере? Какими правилами он пользуется? Я пишу программу, просто как тренировочную, в целях практики, так как я только начинаю путь программирования,ее цель (программы) это тренинг по математике, различного уровня сложности и головоломки, и вот в этой программе, возникли проблемы с расхождением результатов: результат, который ввожу я, (вычисленный на калькуляторе) отличается от результата, который вычисляет компьютер. При том что используемый калькулятор - стандартный в ОС Windows. Мало того значение в переменной округляется на разных этапах компиляции, что приводит в расхождению результатов и невозможно подобрать правильный. Такое ощущение, что компьютер играет со мной в стаканчики и крутит вертит эти результаты, чтобы запутать. Прогонял через отладчик, и даже просто переписывал результат из переменной хранящей результат, но при сравнении снова выдает ошибку совпадения, результаты разные, компилятор округлил значение на каком то этапе компиляции и уже несовпадение. В общем вопрос очень тонкий, надеюсь есть решения, которые можно осуществить на уровне начальных знаний о С++, или же надо подключать сложные и громоздкие математические библиотеки, с которыми я еще не знаком? Конечно программа не принесет прибыли, и даже может пользы (в плане математики) от нее будет не много, но как практическая работа она очень интересная. P.S. Пытался загрузить проект (правда он не закончен), но не получается пока... буду пытаться еще грузить, может кому интересно будет на него взглянуть.
0
|
|
| 25.07.2018, 23:01 | |
|
Ответы с готовыми решениями:
88
Как избежать округления дробных чисел Как избежать округления дробных чисел Каков принцип работы атрибутов |
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 29.07.2018, 19:29 | |
|
Evg, в любом случае как-то оно работать будет. Видел коды на С для микроконтроллеров, не поддерживающих плавающую точку, там примерно так всё и было.
Добавлено через 1 минуту Коды естественно с широким использованием макросов.
0
|
|
|
Комп_Оратор)
|
||||
| 29.07.2018, 22:37 | ||||
Если на каждом щагу округлять до 5 после зпт. то результат будет 0. А на самом деле там тысяча должна получиться. Нет. Я согласен с Evg:
0
|
||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||
| 30.07.2018, 01:52 | ||
|
https://www.cyberforum.ru/post5069723.html вся тема если что Округление числа в C++Builder Не по теме: Evg, пока искал, зачитался, оказывается мы с тобой семь лет общаемся :handshake:
0
|
||
|
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 22
|
||||
| 30.07.2018, 05:35 | ||||
|
И Боже упаси, что за setprecision (поинтересуюсь на досуге)? А на счёт printf видел примеры, но принцип работы с ним я не уловил до конца и в итоге никогда не использовал, любой вывод через cout осуществлял. Если так сказать повспоминать, то чем printf поможет? это же просто вывод в определённом формате, например, как дату вывести число или как-то иначе. Тупо обрезать "хвост" на определённой цифре? и тогда у него не будет сходиться значения вновь. и проще всего использовать уже погрешность вычислений, как писали выше. Если я вас правильно понял, то вы предлагаете использовать printf и вывести (5 цифр после зпт), т.о. 0,01523. 0,12345^2 = 0,0152399025 = 0,01523 Если так, то значения будут разными. Потому что пользователь посчитает 0,01524, проведя округление. Ему нужно не просто увидеть округлённый результат, тогда хватило бы и 1 раз округлить конечный результат. Промежуточные результаты я предлагаю округлять, дабы избежать увеличение погрешности в цепочки формул (Хотя это на скидку я так предполагаю, возможно погрешность остаётся неизменной надо попробовать посчитать, но это уже пусть сам автор темы). Я делал просто калькуляторы для задач, но там я округлял только для красивого вывода результатов расчета, а пользователь вводил лишь входные параметры) . А лучше покажите пример того, что вы предлагаете ему, написать пару строк кода и комментариев много усилий не требует. cheslo + 10^-6 = result где каждое последующее число это результат предыдущего, то значит он сложит миллиард раз и миллиард раз округлит результат. У него имеется своя точность расчёта (10^5 берём опять), т.е. в итоге конечный результат будет тем же числом, что в первой формуле. Если же его точность будет в 6 цифр, значит будут изменения. Банально на число пи вы же не возмущаетесь, почему 3.14 используют в задачках (во всяком случае на производстве и в образовательном процессе), а не те миллионы цифр что известны? Ну а если в одной формуле ему прибавить миллиард раз 10^-6, то изменения будут, т.е. 10^3 Если для поставленной задачи 1000 ед это огромная погрешность, значит нужно просто добавить точность расчета, Ведь согласитесь эти ракетостроители они же не считают в сотых, у них расчеты до миллионных наверное идут, а то и больше, И как бы верно они не округляли, в сотых единицах может получить сильное отклонение полёта, стыковки, попадания в цель и т.д. и т.п. Т.е. научили меня самому познавать что угодно и где угодно, куда лучше, чем знал бы я тупо программирование на си скажем. Теперь я могу самостоятельно все языки изучить, даже русский... Только утопия вообще ни секунды не живет, ибо ни хера они не учат учиться, это вообще как научить кого-то учиться? Я могу понять если научиться учить, но учить учиться о таком философы не думали даже... (за исключением отдельных лиц, которые стараются давать знания не просто прочитав, сказав один раз, а именно объясняют). В итоге и проходим первобытный век, изобретаем p.s. и да синтаксис у меня может смешиваться языки, т.к. в последнее время громко говоря пишу на vba. p.s.s. к сожалению я не отношусь к тому меньшинству поэтому я знаю только 2 способа, Один предложили до меня, второй я изложил во 2 своём посте. А посему если вы считаете, чтовторой способ не является рабочим, то пожалуйста более яснее выражайте свои мысли, покажите наглядный пример почему оно не будет работать, так автор и другие пользователи что-то для себя подчеркнут, когда столкнутся с подобной проблемой. Более того если способ является неверным или очень неграмотным на уровне второго класса, где детишкам можно простить, а я сейчас являюсь источником этой информации, которую возможно, буду распространять и дальше другим людям. Потому что пока ни один аргумент меня не останавливает на это "злодеяние". А сейчас эта тема заполнена кучей бесполезного текста, которая не раскрывает во всяком случае нам недоучкам решение поставленной задачи (словно я открыл опять книгу по си или не по алгоритмизации, где много букв а пользы нет...)
0
|
||||
|
Комп_Оратор)
|
||||
| 30.07.2018, 07:47 | ||||
|
То что вы называете округлением в процессе вычисления, это неразумно. Но главное, же то, что цифровая система, по природе своей такова, что и так уже округляет. Это последняя попытка достучаться. Потому что: Нежелание понять, - хуже непонимания. И наконец: И вот момент: Вы говорите не о том, о чём имеете представление.
0
|
||||
|
|
||||
| 30.07.2018, 09:48 | ||||
|
Добавлено через 23 минуты Не по теме:
1
|
||||
|
Комп_Оратор)
|
||||||
| 30.07.2018, 10:34 | ||||||
|
Я далеко не code racer... а скорее наверно код-дрейсер
Но можно было бы устроить рейсинг. Для начала вот такой кошмарик могу предложить:
0
|
||||||
|
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 22
|
||||
| 30.07.2018, 14:11 | ||||
|
Покопайтесь глубоко в своих воспоминаниях и вспомните, когда что-то вам было не ясно, вы это спрашивали у других людей, если никто из вашего окружения не знал, вы обращались в литературу, если такова была у вас под рукой и уже потом если вас это не особо заинтересовало(на ваш первый взгляд) или в этой литературе вы много не понимали, то вы забиваете на это. Но если есть рядом человек который сможет более доступна объяснить этот момент и/или объясняет написанное в книге, то вас это уже может заинтересовать, а если нет, то вы уже приобретаете понимание и можете в будущем(если не забудете) использовать полученную информацию. Вам помогли понять в начале книги, дальше эти знания вам помогают понимать и то, что в конце излагается. У одних хорошая книжка для них была, в которой автор доступно изложил, у другого человек под боком был, который обладал этими знаниями (а как известно, человек в разы лучше воспринимает информацию от другого себе подобного носителя это уже утверждение, а не абстракция), у третьего не было ни того, ни другого, но у него имелось возможность экспериментировать, но если этих трех составляющих нет или их комбинаций, то у человека и понимания не будет появляться, ему остаётся лишь наблюдать, а наблюдение не даст достоверных знаний и умений, только абстрактные знания, которые лишь могут позволить начать действовать экспериментально. Если ижти через наблюдения, то это очень затяжной процесс, где у каждого человека может быть своя непреодолимая стена или пропасть. А помимо непреодолимых, просто высокие стены, которые тормозят процесс изучения. есть 2 способа обучения, первый это зажечь огонь в душе, на подобие свечи, второй это налить знания в разум человека, подобно в вазу наливаешь воду. Первый способ это там где ты самостоятельно типо познаёшь, но как и свеча в скором времени ты выгоришь и перестанешь познавать. Второй способ позволяет тебе дольше познавать мир и знаний будет в разы больше, но этот процесс выполнить тяжелее и он куда длительнее. Вот пример из недалекого будущего Григорий Перельман, которого учили, а в добавок у него и родители математиками были, было бы странно, если он её не понимал бы (или это говорило бы о безразличии к судьбе своему чаду). Но вот его душу зажёг огонь и он стал изучать эти ряди Ричи, в итоге сумел то, что не могли десятки других учённых (грубо говоря это их стена была непреодолимой или намного выше, чем для Гриши). Он сумел открыть и доказать, но на этом он и выгорел. А понимание у других в этой теме как не было, так и нет (или точнее сказать полного понимания). Может быть им не хватает ваших слов Evg о желании понять а не разжёвывать и чтобы Гриша водил за ручку их... они подбодрит их? и в момент все поймут и не будут как дятлы долбиться в одну и туже теорию перечитывая одну и туже литературу по сотни раз и проводить расчеты из раза в раз Так что господа вы может быть инженеры, программисты или кто там ещё от Бога, но элементарные не понимаете, это ваша стена. p.s. писать не по теме более не буду, Моя точка зрения изложена уже в этих постах довольно кратко, но вполне ясна. p.s.s. нет ничего зазорного в учении и обучении и то как оно протекает, нужно стыдиться отсутствия этого
0
|
||||
|
|
|
| 30.07.2018, 14:48 | |
|
SemenTVS, я твой пост читать не стал, ибо это стандартная жалоба на жизнь. Но на тот случай, если ты здесь, ещё раз озвучу мысль персонально для тебя. Прочти внимательно всю тему. Предварительно выкинь из головы все мысли "я это и так знаю", потому что это не так. И читай с пониманием того, что описываются вещи, которые ты на самом деле не знаешь, или знаешь, но не правильно. Особенно внимательно отнесись к постановке задачи в конце поста #10. А если вдруг постановка задачи не понятна, озвучу её в более простом виде - возьми число 1/3 и запиши его в двоичном представлении в виде 0.0101010... (не знаю, как правильно называется такая форма записи). Затем отрежь фиксированное количество бит после запятой и переведи в десятичную форму. Затем повтори эту процедуру с другим количеством отрезанных бит после запятой. После этого все вопросы отпадут сами собой
Сделай это самостоятельно, при помощи листочка бумаги и ручки, а не так, чтобы кто-то за тебя это сделал. Ибо только так ты осознаешь суть проблемы. Именно так появится различие между "я учусь" и "меня учат". Другими словами, потрать время на что-нибудь полезное, а не на сочинение сопливых постов, которые никто не станет читать
3
|
|
| 30.07.2018, 14:48 | |
|
Каков принцип работы парсера? Aspnet_regsql: каков принцип работы GZipstream - каков принцип многопоточного сжатия/распаковки? Каков принцип работы клиент-серверного приложения Каков принцип работы самого простого web crawler? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|