|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
|
Каков принцип округления дробных чисел у компьютера/компилятора?25.07.2018, 23:01. Показов 8782. Ответов 88
Метки нет (Все метки)
Всем привет.
У меня тут такой вопрос для темы: Как именно осуществляется округление дробных чисел в компьютере? Какими правилами он пользуется? Я пишу программу, просто как тренировочную, в целях практики, так как я только начинаю путь программирования,ее цель (программы) это тренинг по математике, различного уровня сложности и головоломки, и вот в этой программе, возникли проблемы с расхождением результатов: результат, который ввожу я, (вычисленный на калькуляторе) отличается от результата, который вычисляет компьютер. При том что используемый калькулятор - стандартный в ОС Windows. Мало того значение в переменной округляется на разных этапах компиляции, что приводит в расхождению результатов и невозможно подобрать правильный. Такое ощущение, что компьютер играет со мной в стаканчики и крутит вертит эти результаты, чтобы запутать. Прогонял через отладчик, и даже просто переписывал результат из переменной хранящей результат, но при сравнении снова выдает ошибку совпадения, результаты разные, компилятор округлил значение на каком то этапе компиляции и уже несовпадение. В общем вопрос очень тонкий, надеюсь есть решения, которые можно осуществить на уровне начальных знаний о С++, или же надо подключать сложные и громоздкие математические библиотеки, с которыми я еще не знаком? Конечно программа не принесет прибыли, и даже может пользы (в плане математики) от нее будет не много, но как практическая работа она очень интересная. P.S. Пытался загрузить проект (правда он не закончен), но не получается пока... буду пытаться еще грузить, может кому интересно будет на него взглянуть.
0
|
|
| 25.07.2018, 23:01 | |
|
Ответы с готовыми решениями:
88
Как избежать округления дробных чисел Как избежать округления дробных чисел Каков принцип работы атрибутов |
|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
||
| 28.07.2018, 20:56 [ТС] | ||
|
0
|
||
|
Комп_Оратор)
|
|||
| 28.07.2018, 20:58 | |||
|
b = c+d a = d+c a != b А выражение abs(a-b)<eps решает и данную проблему. Только это не для детсадовских деток. Пусть голубей гоняют. Им еще хватит на их веку.
0
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 28.07.2018, 21:02 | ||
|
0
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||
| 28.07.2018, 21:27 | ||
|
внутри компьютера все данные хранятся в двоичном виде! для удобства чтения человеком данные могут представляться в шестнадцатеричном виде(Си не поддерживает двоичный формат) двоичные в шестнадцатеричные и наоборот преобразуются без потерь
0
|
||
|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
|
| 28.07.2018, 22:11 [ТС] | |
|
Буду пробовать решить данную задачу исходя из предоставленных Вами справок и информации. О результатах и о спорных моментах буду докладывать. Вопросы еще есть конечно, но далее попробую сам покопаться в этом, учиться то надо мне, значит и пытаться тоже мне. Всем
0
|
|
|
Комп_Оратор)
|
||
| 28.07.2018, 22:48 | ||
![]() Посмотрите кстати программку aneasycalc. Она, при включённом "Интеллектуальном алгоритме" будет давать всегда один и тот же результат при любых математически тождественных выражениях, независимо от порядка операций в записи. Дети будут довольны. И поскольку дети - святое дело, обещаю вам ключ к полной версии в подарок. Удачи!
0
|
||
|
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 22
|
||||||||||||
| 28.07.2018, 23:44 | ||||||||||||
|
предположим расчёт идет в 2 формулы. 1) обрезаете входные данные до первой формулы, чтобы кол-во знаков не превышало 5, потом проводите расчет по 1 формуле 2) обрезаете результат первой формулы также до 5 знаков и проводите расчёт по 2 формуле 3) обрезаете конечный результат и потом уже сравниваете для дальнейших действий. Если у вас черти сколько формул, то чтобы каждый раз не писать эту формулу округления / откидывания сделайте функцию
написал 1 формулу, для наглядности
Добавлено через 4 минуты Если это то, что вам нужно, то можете добавить точность расчета, чтобы пользователь сам выбирал сколько знаков после запятой должно быть, конечно, в меру возможности аппаратуры и по.
0
|
||||||||||||
|
Комп_Оратор)
|
||
| 29.07.2018, 10:52 | ||
|
получим: 0,0152399025 тут 10 знаков. Вы предлагаете оставить 5 ? 0,01523 И правда, - подумаешь, "почти" 0,00001 разница. Неважно, что она в результате округления попала в 5-й "разрешённый" разряд. Важно именно то, что потеряно 5 знаков: 0,0000099025 -не больше ни меньше. SemenTVS, я спрашивал вас, что значит "округлять в процессе вычисления". https://www.cyberforum.ru/post12567064.html Вы не ответили тогда. Скажите, этот ваш последний пост можно считать ответом? Если да, - можете не отвечать. В знак согласия.
0
|
||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 29.07.2018, 11:25 | |
|
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||
| 29.07.2018, 11:55 | ||
и не может![]() все зависит от задачи точность понятие абстрактное она бывает абсолютная и относительная
0
|
||
|
|
||
| 29.07.2018, 12:12 | ||
|
2
|
||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 29.07.2018, 12:55 | |
|
Evg, а как правильно-то?
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
|||||||||
| 29.07.2018, 13:25 | |||||||||
переполнение однако![]() вот например
например раньше были электрические счетчики с тремя разрядами, потом надзорные органы сильно удивлялись , как так нажгли 1Квт за месяц ![]() этак и логарифмическую линейку можно эрзацем назвать ![]() Другое дело что в абсолют их вводить не стоит еще раз процитирую "Иду на грозу" Д. Гранина
0
|
|||||||||
|
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 22
|
|||||||
| 29.07.2018, 14:14 | |||||||
|
А что касается погрешности, то function_round (0,12345^2 * 10^5) / 10^5 1) 0,12345*0,12345 = 0,0152399025 2) 0,0152399025*10^5= 1523,99025 потом используем одну из функций которая нам либо округлит в большую, меньшую или вовсе откинет все цифры после зпт. в зависимости от цели автора, получим либо 1523 (в случае отбрасывания или округления до меньшего целого) или 1524 (если округлять к большему или математически правильно) 3) теперь мы обратно делим на 10^5, получаем 0,01523 или 0,01524 4) сравниваем результат пользователя и программный тут главное нужно знать как и с какой точностью будет считать пользователь (если он в 1 формуле считал до сотых, в другой до миллионных и скачет как горный козел, то тогда остаётся только работать с погрешностями вычислений). Но если он считает с определённой точностью, то я предлагаю дать выбирать пользователю точность расчета. Ибо зачастую в задачах просят до сотых считать, а я люблю делать хорошо и в меру своих знаний и опыта (ну или просто по выпендриваться) и брал всегда тысячные. Возможно, там тоже найдутся выпендрёжники или лентяи считающие до десятых. А чтобы не было крашей от степени (ведь кто-то захочет ввести 12451212512...) задать условие на ввод степени, скажем от 1 до 6.
0
|
|||||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||
| 29.07.2018, 15:36 | ||
|
SemenTVS, в рассуждениях вроде все правильно
![]() а вот в записи это все таки не Бэйсик
0
|
||
|
|
|||
| 29.07.2018, 16:59 | |||
|
0
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 29.07.2018, 17:38 | |
|
SemenTVS, если тебе нужны числа строго до сотых, используй long long int, а то, что там запятая находится перед третьим числом, держи в уме (и при задании нового значения)
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 29.07.2018, 18:09 | ||
|
0
|
||
|
|
|
| 29.07.2018, 18:31 | |
|
Как-то получается извращения ради извращений. Хотя для простых денежных рассчётов с виду сойдёт, если не уходить в область вычисления банковских процентов или наличия дробного количества актива
Добавлено через 15 минут Хотя с умножением и делением есть тонкости 0.01 / 0.02 = 0.50 Однако если вещественные числа будем представлять целыми, держа в уме, что два последних разряда на самом деле после запятой, то в реальности получим, 001 / 002 = 0, хотя должны были получить 050. Поэтому перед делением надо делитель на 100 умножить Умножение косячит аналогично 0.05 * 0.06 = 0.0030 В наших терминах должно получиться 005 * 005 = 000 (поскольку у нас только две цифры после запятой), а потому результат надо ещё на 100 поделить
0
|
|
| 29.07.2018, 18:31 | |
|
Каков принцип работы парсера? Aspnet_regsql: каков принцип работы GZipstream - каков принцип многопоточного сжатия/распаковки? Каков принцип работы клиент-серверного приложения Каков принцип работы самого простого web crawler? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу
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, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|