Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1

Реализовать класс чисел с плавающей точкой

01.03.2015, 20:06. Показов 4446. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Интересует такой вопрос,как реально можно реализовать класс чисел с плавающей точкой.
Какие поля использовать?Как представить вещественное число допустим 5.25 в таком формате:
https://www.cyberforum.ru/cgi-bin/latex.cgi?(S)*1.M*{2}^{E}
Где S-знак,M мантисса в пределах [0,1] (наверное),2- основание,E порядок.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2015, 20:06
Ответы с готовыми решениями:

Вычисления с плавающей точкой
Объясните пожалуйста, почему во всех высоких языках программирования при использовании вычисления с плавающей точкой на выходе программы...

Тип числа с плавающей точкой
Добрый день,подскажите где можно почитать хороший материал про тип с плавающей точкой(запятой). Я пишу класс,в котором важны...

Число с плавающей точкой в памяти компьютера
Доброго времен суток, извиняюсь, если попал не в тот раздел :( Итак, возник вопрос, как хранится число с плавающей точкой в памяти...

32
2621 / 1632 / 266
Регистрация: 19.02.2010
Сообщений: 4,329
01.03.2015, 23:41
Зачем? Это "стандартный" тип данных для процессора. Вернее, два типа на выбор - одинарной и двойной точности.

В таком формате (стандарт IEEE-754) плавучка в процессоре и хранится. Чтобы из двоичного представления вытащить мантиссу и/или порядок - курите стандарт, там описано, в каких битах-байтах что лежит.
А перевести записанное в символьном виде число (Ваше "5.25" в виде текстовой строки) во внутренний процессорный формат, или сделать перевод обратно (из двоичного представления в строку) - в каждом языке программирования среди стандартных средств языка или его библиотеки функций имеются таки возможности.

Т.е. самостоятельное программирование класса - это или для учебных целей (научиться переопределять операторы типа оператора "плюс") или для реализации, например, горааааздо большей точности.
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
03.03.2015, 17:56  [ТС]
У меня стоит задача,написать класс на C++ чисел с плавающей точкой.И переопределить операции +,-,*,/.
В дальнейшем попробовать изменять основание,то есть брать к примеру не 2 или 10 а 3-ку попробовать.
Вот на данный момент у меня такое представление https://www.cyberforum.ru/cgi-bin/latex.cgi?(S)*M*{10}^{E} ,где мантисса получается любое целое число >0.
И вот так реализована операция сложения :
К пример нужно сложить 3.14 и 31.4
https://www.cyberforum.ru/cgi-bin/latex.cgi?3.14=314*{10}^{-2}
https://www.cyberforum.ru/cgi-bin/latex.cgi?31.4=314*{10}^{-1}
Сделаем выравнивание https://www.cyberforum.ru/cgi-bin/latex.cgi?314*{10}^{-1}=3140*{10}^{-2}
Далее сложим https://www.cyberforum.ru/cgi-bin/latex.cgi?314*{10}^{-2}+3140*{10}^{-2}=3454*{10}^{-2}=34.54
Но почитав информацию,я нашел что выравнивают не к меньшему порядку,а к большему...То есть в моем контексте невозможно это сделать.
А вот если бы число хранилось в таком виде https://www.cyberforum.ru/cgi-bin/latex.cgi?(S)*1.M*{10}^{E}
То я бы смог представить число https://www.cyberforum.ru/cgi-bin/latex.cgi?3.14=1.314*{10}^{-2}=1.0314*{10}^{-1} в таком вот виде и сложить соответственно https://www.cyberforum.ru/cgi-bin/latex.cgi?1.0314*{10}^{-1} и https://www.cyberforum.ru/cgi-bin/latex.cgi?1.314*{10}^{-1}
Но как это сделать,не имея в руках вещественных чисел,непонятно.То есть там получается существует единица,которая не используется.https://www.cyberforum.ru/cgi-bin/latex.cgi?1.M, M принадлежит (0;1)
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
04.03.2015, 13:28
Цитата Сообщение от DmitryM5 Посмотреть сообщение
А вот если бы число хранилось в таком виде
А ведь это и есть нормализованное представление, которое исключает множественное преставление одного и того же числа и ситуации когда нам нужно подгонять порядок изменяя обе мантиссы чисел в операциях.
Только вот, в нормализованном представлении в "1.М" это двоичное число и "1" всегда является первым битом мантиссы, но представленный вами пример смотрится странновато.
Вот правильные равенства https://www.cyberforum.ru/cgi-bin/latex.cgi?3.14 = 0.314*{10}^{1} = 0.0314*{10}^{2}
Тогда как в https://www.cyberforum.ru/cgi-bin/latex.cgi?3.14 = 1.314*{10}^{-2} = 1.0314*{10}^{-1} степени десятки явно неправильные, и единица... извините, но мне вообще непонятно по какой логике она тут появляется.

Вы сразу скажите - вам надо в десятичной системе счисления, или в двоичной, если первое то:
Кликните здесь для просмотра всего текста
Предлагаю просто взять идею нормализации - руководствоваться правилом что мантисса из всех возможных представлений должна быть наибольшим числом.
Если реализовывать класс вещественных чисел в десятичной системе счисления, то можно обрезать максимальное число которое может предоставить выбранный целочисленный тип (для хранения мантиссы) до ближайшего числа позволяющее записать все десятичные числа заданной длинны.
Т.е. если не ошибся, то получается
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}N \geq  {10}^{trunc({log}_{10}(MAX))}\\  N <   {10}^{trunc({log}_{10}(MAX))+1}\end{matrix}\right.
Например, если берем тип Word, то максимальное число это 65535, при этом максимальное десятичное число это 9999, соответственно мантисса всегда должна принимать значения от 1000 до 9999. Только число "ноль", также как и в стандартных вещественных числах, придется реализовывать дополнительно (как и значения INF и NaN)
http://habrahabr.ru/post/112953/ (что нужно знать о вещественных числах)
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
04.03.2015, 22:01  [ТС]
Спасибо,немного просветили.
Мне нужно использовать основание 2,но вначале хотя бы с основанием 10 разобраться,поскольку с ним легче воспринимается.
Ну и все таки мне непонятно,как представлять имея под рукой только целые числа,вещественные.
На примере моих чисел выше(операция +) было бы неплохо увидеть как выровнять порядки и мантиссу...
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
04.03.2015, 22:30
Для двоичных как раз проще получется. По крайней для меня.
По ссылке что я дал вполне подробно расписано.

Пусть у нас есть 1101*2^1 и 1101*2^2
Пусть в памяти это записывается как
001 1101000
010 1101000
Выравниваем
010 0110100
010 1101000
складываем мантиссы
0110100 +
1101000
----------
10011100
это число на один разряд больше, изменяем порядок на +1, а последний бит получившейся мантиссы отбрасываем
011 1001110

Добавлю, что это сильно упрощенный пример, так если используется нормализированное представление то первый бит мантиссы всегда 1 и он всегда учитывается, но по факту никогда не записывается в память. (по крайней мере судя по тому что я прочитал).
К слову, можно самому посмостреть как работают вещественные цифры - делаем пару вещественных переменных, берем указатель на них, читаем из указателя целочисленное беззнаковое число и конвертируем в бинарное число.
после этого играемся с вещественными числами и смотрим как изменяется их содержимое.
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
04.03.2015, 23:08  [ТС]
Вы мантиссу в двоичной системе счисления представляете?
А как сделать с десятичной?
Выходит основание определяет систему счисления мантиссы?Если 2-то двоичная,если 10,то десятичная?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
07.03.2015, 01:02
Да, в двоичной.
Нет, основание степени можно брать любое, в теории, но на практике быстрее и удобнее брать систему счисления.
Для десятичной делаем то же самое, но считаем что память имеет не 2, а 10 состояний.
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
08.03.2015, 22:03  [ТС]
Цитата Сообщение от wingblack Посмотреть сообщение
Да, в двоичной.
Нет, основание степени можно брать любое, в теории, но на практике быстрее и удобнее брать систему счисления.
Для десятичной делаем то же самое, но считаем что память имеет не 2, а 10 состояний.
То есть можно так?https://www.cyberforum.ru/cgi-bin/latex.cgi?{(-1)}^{S}*M*{2}^{E}
Где M мантисса,типа int.
И E порядок типа int.
Как тогда выравнивать порядки?По идее нужно делить на 2-ку.Но вопрос как с целым числом это сделать?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
11.03.2015, 12:58
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Как тогда выравнивать порядки?По идее нужно делить на 2-ку.Но вопрос как с целым числом это сделать?
Если нужно выравнять порядок двух таких чисел для операций сложения или вычитания (для умножения/деления выравнивание не требуется), то в меньшем числе делим М (мантиссу) на 2 столько раз на сколько порядок E меньше требуемого. Естественно, теряется часть значимых бит в мантиссе меньшего числа.

Хочу заметить что для мантиссы нужно брать тип данных "целое без знака".
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
11.03.2015, 18:00  [ТС]
Цитата Сообщение от wingblack Посмотреть сообщение
Если нужно выравнять порядок двух таких чисел для операций сложения или вычитания (для умножения/деления выравнивание не требуется), то в меньшем числе делим М (мантиссу) на 2 столько раз на сколько порядок E меньше требуемого. Естественно, теряется часть значимых бит в мантиссе меньшего числа.

Ну я понимаю что нужно делать,вопрос как?
Вот Рассмотрим пример:
Такое представление https://www.cyberforum.ru/cgi-bin/latex.cgi?{(-1)}^{s}*M*{10}^{E}
Допустим числа https://www.cyberforum.ru/cgi-bin/latex.cgi?1999*{10}^{-2} и https://www.cyberforum.ru/cgi-bin/latex.cgi? 32*{10}^{2}, Операция +!
Нужно привести к порядку 2,то есть где 1999 сделать порядок равным 2.
Тогда примерно такое действие https://www.cyberforum.ru/cgi-bin/latex.cgi?0.1999*{10}^{2} и https://www.cyberforum.ru/cgi-bin/latex.cgi? 32.0*{10}^{2}
То есть мы разделили мантиссу на https://www.cyberforum.ru/cgi-bin/latex.cgi?{10}^{4}
Но у нас нету вещественного типа или точки вообще,я орудую же по факту целыми числами.
Как получить с помощью деления нужную мантиссу?И провести операцию + после?
Как программно сделать это действие?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
12.03.2015, 10:57
Еще раз о нормализованном представлении чисел
есть 2*10^2
есть 20*10^1
два одинаковых числа с разным представлением
Чтобы этого не было, мы берем такое число в мантиссе, чтобы оно максимально забивало всю отведенную под мантиссу память значимыми цифрами.
Так, в статье на Хабрахабре по ссылке что я дал ранее, упоминается, что в двоичном представлении мантисса всегда имеет первую цифру "1", которая даже не хранится в памяти, но всегда учитывается при вычислениях(как именно это делается я, правда, не знаю).

Таким образом, при приведении мантисс к одинаковой степени у нас никогда не будет вещественных чисел. Если меньшее число настолько малое, что получается что мантисса меньше единицы, то это можно считать погрешностью. Если хочешь - можешь учитывать мантиссы если их можно округлить до единицы. Вообще тут надо почитать описание стандарта вещественных чисел, как они там все устроили.

Добавлено через 10 минут
Возвращаясь к вашему примеру.
Пусть в мантиссе у нас помещается 4 цифры
1999*10-2
32*102=3200*100
Приводим к общему порядку
1999*10-2=19*100
32*102=3200*100+19*100=3219*100
Нужно ли округлять мантиссу при отбрасывании значимых цифр - либо выбирайте сами, либо читайте стандарт.
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
12.03.2015, 12:33  [ТС]
Приводят одно из чисел к большему порядку,вы же взяли привели два числа к чему то среднему это не то, что нужно как я понимаю ...
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
12.03.2015, 15:15
Я привел мантиссы к нормализованному виду, а уже потом над этим плясать. Иначе получаем необходимость работать с мантиссой как с вещественным числом, чего быть не должно.

Добавлено через 4 минуты
Правда я там совершил опечатку
0
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
12.03.2015, 17:11  [ТС]
У нас было 32,а вы домножили еще его на 100.Насколько я понимаю этого не нужно делать,так как возможно переполнение..
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
12.03.2015, 17:41
Цитата Сообщение от DmitryM5 Посмотреть сообщение
У нас было 32,а вы домножили еще его на 100.Насколько я понимаю этого не нужно делать,так как возможно переполнение..
Если мы считаем что ячейки памяти под мантиссу имеют 10 значений и у нас есть 4 ячейки, то максимальное десятичное число которые мы можем записать - 9999, я исходил из этих предположений
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
15.03.2015, 21:25  [ТС]
Цитата Сообщение от wingblack Посмотреть сообщение
Если мы считаем что ячейки памяти под мантиссу имеют 10 значений и у нас есть 4 ячейки, то максимальное десятичное число которые мы можем записать - 9999, я исходил из этих предположений
В верхних ваших выкладках вы не нормализуете числа...
Число называется нормализованным,если оно выглядит так: https://www.cyberforum.ru/cgi-bin/latex.cgi?{(-1)}^{S}*M*{10}^{E} где М мантисса,лежит в диапазоне 1<=M<10 для нашего случая,так как основание равно 10.
Вот что нужно делать:
https://www.cyberforum.ru/cgi-bin/latex.cgi?19,99=1999*{10}^{-2}=1.999*{10}^{1}
https://www.cyberforum.ru/cgi-bin/latex.cgi?32*{10}^{2}=3.2*{10}^{3}
Далее выравниваем https://www.cyberforum.ru/cgi-bin/latex.cgi?0.01999*{10}^{3} и складываем https://www.cyberforum.ru/cgi-bin/latex.cgi?(0.01999+3.2)*{10}^{3}=3.21999*{10}^{3}=3219.99
Как это теоретически делается я понимаю,но то что у нас в программе только целые числа,и я не должен использовать вещественные,точку итд. непонятно как реализовать такие действия и такое представление...
Вопрос остается открытым.
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
16.03.2015, 10:13
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Как это теоретически делается я понимаю,но то что у нас в программе только целые числа,и я не должен использовать вещественные,точку итд. непонятно как реализовать такие действия и такое представление...
Вот почему число нужно привести к виду, в котором мантисса занимает всю память которую мы под мантиссу отвели - тогда особых проблем с целочисленными мантиссами не будет.

Добавлено через 25 минут
Хорошо, рассмотрим представленное вами нормализованное представление числа.
Для мантиссы мы не будем использовать вещественные числа, а чтобы хранить мантиссу в числе целого типа будем изменять исходное число так, чтобы мантисса заняла всю отведенную под неё память.
19.99 = 1.999*101
пусть у нас ячейки памяти хранят десятичные числа и под мантиссу у нас 6 ячеек, тогда число в памяти будет иметь вид
0 01 1.99900
Здесь точка только для наглядности.

Добавлено через 18 минут
Т.е. если у нас есть число в нормализованном виде, то мы просто переписываем число в мантиссу начиная с первой ячейки. По сути, не сильно отличается от моего предыдущего предложения, поскольку если мы также пытаемся забить всю память под мантиссу значащими цифрами.
1
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
16.03.2015, 22:19  [ТС]
Вот что то прояснилось мне,спасибо.
Однако что делать при операциях ПРЕДПОЛОЖИМ ЧИСЛА НОРМАЛИЗОВАННЫ так как выше описано.
1) Умножить: допустим 199900*320000=уже вышли с диапазона...(предположим так же 6 ячеек под мантиссу).
2) Плюс: допустим 900000+100000=1 000000 опять тоже самое
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
17.03.2015, 08:52
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Однако что делать при операциях ПРЕДПОЛОЖИМ ЧИСЛА НОРМАЛИЗОВАННЫ так как выше описано.
1) Умножить: допустим 199900*320000=уже вышли с диапазона...(предположим так же 6 ячеек под мантиссу).
2) Плюс: допустим 900000+100000=1 000000 опять тоже самое
Например, для хранения результатов операций можно взять промежуточную переменную использующую до двух раз больше памяти чем мантисса, затем её нормализовать. Если мы выбрали такой размер мантиссы, что не можем хранить результат операций в стандартных типах данных, то применять длинную арифметику разбивая мантиссу на 2 и более частей. Или, если задача не строгая и для не сильно больших (во всех смыслах) чисел, то можно схитрить и внутри операций использовать вещественные числа, а результат снова приводить к целому числу для записи в мантиссе.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.03.2015, 08:52
Помогаю со студенческими работами здесь

Как выглядит число с плавающей точкой в 2й системе?
Если цифра выглядит как Тогда как будет выглядеть: ? Пробовал в файл записать и посмотреть Hex Edit'ом, в обоих случаях ...

Преобразование 64-битного числа в число с плавающей точкой
Доброго всем времени суток! Суть вопроса: Не могу придумать алгоритм преобразования 64-битного числа (последовательность из 8-ми байт)...

Преобразование чисел с плавающей точкой в числа с фиксированной точкой
Здравствуйте, подскажите пожалуйста как заменить вещественные числа с плавающей точкой, числами округленными до десятых, записанными в...

Класс : Число с плавающей запятой(точкой)
Подскажите,где можно побольше узнать о числах с плавающей запятой,желательно не теоретическую часть,а программную. У меня задания...

Добавить в класс возможность вычисления значенний с плавающей точкой
Есть код программи , надо добавить в него возможность считать не только целие числа, а й реальние. Как разобрать строку ? Чтоб получились...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru