|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
|
Каков принцип округления дробных чисел у компьютера/компилятора?25.07.2018, 23:01. Показов 8787. Ответов 88
Метки нет (Все метки)
Всем привет.
У меня тут такой вопрос для темы: Как именно осуществляется округление дробных чисел в компьютере? Какими правилами он пользуется? Я пишу программу, просто как тренировочную, в целях практики, так как я только начинаю путь программирования,ее цель (программы) это тренинг по математике, различного уровня сложности и головоломки, и вот в этой программе, возникли проблемы с расхождением результатов: результат, который ввожу я, (вычисленный на калькуляторе) отличается от результата, который вычисляет компьютер. При том что используемый калькулятор - стандартный в ОС Windows. Мало того значение в переменной округляется на разных этапах компиляции, что приводит в расхождению результатов и невозможно подобрать правильный. Такое ощущение, что компьютер играет со мной в стаканчики и крутит вертит эти результаты, чтобы запутать. Прогонял через отладчик, и даже просто переписывал результат из переменной хранящей результат, но при сравнении снова выдает ошибку совпадения, результаты разные, компилятор округлил значение на каком то этапе компиляции и уже несовпадение. В общем вопрос очень тонкий, надеюсь есть решения, которые можно осуществить на уровне начальных знаний о С++, или же надо подключать сложные и громоздкие математические библиотеки, с которыми я еще не знаком? Конечно программа не принесет прибыли, и даже может пользы (в плане математики) от нее будет не много, но как практическая работа она очень интересная. P.S. Пытался загрузить проект (правда он не закончен), но не получается пока... буду пытаться еще грузить, может кому интересно будет на него взглянуть.
0
|
|
| 25.07.2018, 23:01 | |
|
Ответы с готовыми решениями:
88
Как избежать округления дробных чисел Как избежать округления дробных чисел Каков принцип работы атрибутов |
|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
||||
| 27.07.2018, 10:47 [ТС] | ||||
Более точная суть моего вопроса такова: Как заставить/попросить компилятор игнорировать "мусор", чтоб он не мешал сравнению результата, потому что именно этот "мусор" мешает работе. P.S. Вот так будет конкретно поставлена цель моего вопроса, хотя я сам чувствую ее не корректность. Добавлено через 10 минут
0
|
||||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||
| 27.07.2018, 11:19 | ||
|
txtbit, хотел бы внести некоторое уточнение по поводу:
Как поменять режим сразу не скажу,т.к. не пользуюсь. Обхожусь округлением к меньшему. Например, когда надо округлить до ближайшего, я перед преобразованием в целое добавляю 0.5
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 27.07.2018, 11:42 | ||
|
±знак · (1+ (мантисса/252)) × 2порядок − 1023
1
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||||||
| 27.07.2018, 11:52 | ||||||
|
есть старый способ округления, использовался еще до сопроцессоров
например нужно округлить до сотых делаем так
1
|
||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 27.07.2018, 12:55 | ||
|
Общий порядок определять, взяв логарифм числа по основанию 2 и округлив до меньшего целого. Для мантиссы нужно поделить исходное число на 2 в степени, полученной из логарифма. Вычтя после этого 1 и умножив остаток на 2^52 и округлив до целого получишь мантису.
На примере 0.1 : log2 0.1 = -3.32..., степень -4 (т.е. поделить на 2^-4 или умножить на 16), итого получаем 1.6, 1 вычитаем, и 0.6 умножаем на 2^52 = 4503599627370496 . Получаем число 2702159776422297.6, с дробной частью которая будет процессором округляться. И именно на эту дробную часть и будет отличаться записанное в double число от 0.1 . Суммарно запишется (1 + 2702159776422298/252)*21019-1023 Добавлено через 51 минуту В общем всё будет сложно. Но обычно (если речь не идёт о деньгах и прочих высчитываемых "абсолютно" вещах) просто пренебрегают этими ошибками и говорят "это у нас double, у него примерно 16-17 десятичных знаков, которые будут повторены точно при введении, за столько-то действий у нас ошибка вычислений не должна превысить 2-3 знака в мантисе, значит будем пользоваться только первыми 13 знаками".
0
|
||
|
|
||||
| 27.07.2018, 12:59 | ||||
|
1
|
||||
|
Комп_Оратор)
|
||
| 27.07.2018, 13:19 | ||
|
txtbit, кроме формата (см. например стандарт IEEE 754 https://ru.wikipedia.org/wiki/IEEE_754-2008) есть ещё проблема сохранения значимости. Тут и близко нельзя говорить о "малой крови" в реализации. Но что бы понять предмет может пригодиться:
https://www.cyberforum.ru/blog... g3523.html смотрите внизу, начиная со слов:
0
|
||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||
| 27.07.2018, 14:12 | ||
|
не представляет точно число из компьютера в число на дисплей, сиречь из двоичного в десятичное представление? Разумеется нет ибо системы счисления разные![]() я могу так же привести в пример задачи которые на АВМ решались точно, а на ЭВМ с определенной долей погрешности ![]() или что то другое имелось в виду? В прочем мы с тобой это уже обсуждали несколько лет тому назад
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 27.07.2018, 15:42 | ||
|
Добавлено через 8 минут В общем по сумме всего - автору искать или делать библиотеку или которая работает с обыкновенными дробями, или библиотеку которая работает с числами с десятичным основанием степени (тогда ошибки вычисления будут более прозрачными для понимания).
0
|
||
|
|
|||
| 27.07.2018, 16:37 | |||
|
C #include <stdio.h> int main (void) { double a=1.23456789; double b=a*100+0.5; int c=(int)b; double d=(double)c/100.0; printf ("%.20f\n", d); } Code $ gcc t.c
$ ./a.out
1.22999999999999998224К тому же у ТС, если я правильно понял, другая задача. Ему нужно работать с точным значением числа, а вовсе не напечатать на экране видимость того, что число точное. А для работы с точными значениями есть только один способ - программная эмуляция. Т.е. через специальные библиотеки
1
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
||||
| 27.07.2018, 16:43 | ||||
|
105=100000=0b1100001101010000=216+215+210+29+27+25 а вот здесь
0
|
||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||
| 27.07.2018, 16:48 | |||
|
Добавлено через 1 минуту
0
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
|||||
| 27.07.2018, 16:53 | |||||
|
почему он не меряет расстояние до Луны с точностью до микронов,ангстремов....
Добавлено через 2 минуты ![]()
0
|
|||||
|
|
|||
| 27.07.2018, 16:55 | |||
|
1
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||||
| 27.07.2018, 17:11 | ||||||||
Добавлено через 3 минуты . Те примеры, которые он дал в посте #6 показывают, что скорее всего не знаком с обыкновенными дробями и не слышал о нахождении наибольшего общего делителя.
0
|
||||||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
|
|
| 27.07.2018, 17:42 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 22
|
|
| 27.07.2018, 17:49 | |
|
Стоит ли вам так округлять для сравнения до n знаков не вижу смысла, ведь это можно считать ошибкой.
ведь одно дело когда 5,0005 == 5, другое когда 0,001==0,0015 Но может это вам поможет, когда мне нужно было выводить фиксированной длины знаков после зпт, то я либо в процессе расчета, либо перед выводом, округлял их с помощью round или других функций округления обычно до 3 знаков требовалось round(znachenie * 1000) / 1000 или мб вам стоит перед началом умножить значения переменных на 100000 , провести расчеты,а перед сравнением снова разделить на 100000 и вывести результаты.
0
|
|
|
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 84
|
|||||||
| 27.07.2018, 23:52 [ТС] | |||||||
Вписать распознание кириллицы придется самим, потому что я не знаю пока как именно ее распознавать, меня пока так все устраивает...
Эти примеры решаются методами описанными вами выше, уважаемые форумчане, но просто задумка этой программы, чтоб человек, который не в курсе всех этих премудростей математики, мог просто потренироваться в вычислении подобных примеров (не знаю зачем ему это, но просто такой кайф у него в свободное время), и чтоб просто порешав на бумаге, он мог ввести свои результаты и они совпадали с тем, что "на решал" компьютер.
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 27.07.2018, 23:56 | ||||
1
|
||||
| 27.07.2018, 23:56 | |
|
Каков принцип работы парсера? 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
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|