|
Консультант Витте
|
|
Реализовать класс чисел с плавающей точкой01.03.2015, 20:06. Показов 4446. Ответов 32
Метки нет (Все метки)
Добрый вечер!
Интересует такой вопрос,как реально можно реализовать класс чисел с плавающей точкой. Какие поля использовать?Как представить вещественное число допустим 5.25 в таком формате: Где S-знак,M мантисса в пределах [0,1] (наверное),2- основание,E порядок.
0
|
|
| 01.03.2015, 20:06 | |
|
Ответы с готовыми решениями:
32
Вычисления с плавающей точкой
Число с плавающей точкой в памяти компьютера |
|
2621 / 1632 / 266
Регистрация: 19.02.2010
Сообщений: 4,329
|
|
| 01.03.2015, 23:41 | |
|
Зачем? Это "стандартный" тип данных для процессора. Вернее, два типа на выбор - одинарной и двойной точности.
В таком формате (стандарт IEEE-754) плавучка в процессоре и хранится. Чтобы из двоичного представления вытащить мантиссу и/или порядок - курите стандарт, там описано, в каких битах-байтах что лежит. А перевести записанное в символьном виде число (Ваше "5.25" в виде текстовой строки) во внутренний процессорный формат, или сделать перевод обратно (из двоичного представления в строку) - в каждом языке программирования среди стандартных средств языка или его библиотеки функций имеются таки возможности. Т.е. самостоятельное программирование класса - это или для учебных целей (научиться переопределять операторы типа оператора "плюс") или для реализации, например, горааааздо большей точности.
1
|
|
|
Консультант Витте
|
|
| 03.03.2015, 17:56 [ТС] | |
|
У меня стоит задача,написать класс на C++ чисел с плавающей точкой.И переопределить операции +,-,*,/.
В дальнейшем попробовать изменять основание,то есть брать к примеру не 2 или 10 а 3-ку попробовать. Вот на данный момент у меня такое представление И вот так реализована операция сложения : К пример нужно сложить 3.14 и 31.4 Сделаем выравнивание Далее сложим Но почитав информацию,я нашел что выравнивают не к меньшему порядку,а к большему...То есть в моем контексте невозможно это сделать. А вот если бы число хранилось в таком виде То я бы смог представить число Но как это сделать,не имея в руках вещественных чисел,непонятно.То есть там получается существует единица,которая не используется.
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 04.03.2015, 13:28 | ||
|
Только вот, в нормализованном представлении в "1.М" это двоичное число и "1" всегда является первым битом мантиссы, но представленный вами пример смотрится странновато. Вот правильные равенства Тогда как в Вы сразу скажите - вам надо в десятичной системе счисления, или в двоичной, если первое то: Кликните здесь для просмотра всего текста
Предлагаю просто взять идею нормализации - руководствоваться правилом что мантисса из всех возможных представлений должна быть наибольшим числом.
Если реализовывать класс вещественных чисел в десятичной системе счисления, то можно обрезать максимальное число которое может предоставить выбранный целочисленный тип (для хранения мантиссы) до ближайшего числа позволяющее записать все десятичные числа заданной длинны. Т.е. если не ошибся, то получается Например, если берем тип Word, то максимальное число это 65535, при этом максимальное десятичное число это 9999, соответственно мантисса всегда должна принимать значения от 1000 до 9999. Только число "ноль", также как и в стандартных вещественных числах, придется реализовывать дополнительно (как и значения INF и NaN) http://habrahabr.ru/post/112953/ (что нужно знать о вещественных числах)
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
|
|
|
Консультант Витте
|
|
| 04.03.2015, 23:08 [ТС] | |
|
Вы мантиссу в двоичной системе счисления представляете?
А как сделать с десятичной? Выходит основание определяет систему счисления мантиссы?Если 2-то двоичная,если 10,то десятичная?
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 07.03.2015, 01:02 | |
|
Да, в двоичной.
Нет, основание степени можно брать любое, в теории, но на практике быстрее и удобнее брать систему счисления. Для десятичной делаем то же самое, но считаем что память имеет не 2, а 10 состояний.
1
|
|
|
Консультант Витте
|
||
| 08.03.2015, 22:03 [ТС] | ||
|
Где M мантисса,типа int. И E порядок типа int. Как тогда выравнивать порядки?По идее нужно делить на 2-ку.Но вопрос как с целым числом это сделать?
0
|
||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 11.03.2015, 12:58 | ||
|
Хочу заметить что для мантиссы нужно брать тип данных "целое без знака".
1
|
||
|
Консультант Витте
|
||
| 11.03.2015, 18:00 [ТС] | ||
|
Ну я понимаю что нужно делать,вопрос как? Вот Рассмотрим пример: Такое представление Допустим числа Нужно привести к порядку 2,то есть где 1999 сделать порядок равным 2. Тогда примерно такое действие То есть мы разделили мантиссу на Но у нас нету вещественного типа или точки вообще,я орудую же по факту целыми числами. Как получить с помощью деления нужную мантиссу?И провести операцию + после? Как программно сделать это действие?
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
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 12.03.2015, 15:15 | |
|
Я привел мантиссы к нормализованному виду, а уже потом над этим плясать. Иначе получаем необходимость работать с мантиссой как с вещественным числом, чего быть не должно.
Добавлено через 4 минуты Правда я там совершил опечатку
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 12.03.2015, 17:41 | ||
|
1
|
||
|
Консультант Витте
|
||
| 15.03.2015, 21:25 [ТС] | ||
|
Число называется нормализованным,если оно выглядит так: Вот что нужно делать: Далее выравниваем Как это теоретически делается я понимаю,но то что у нас в программе только целые числа,и я не должен использовать вещественные,точку итд. непонятно как реализовать такие действия и такое представление... Вопрос остается открытым.
0
|
||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 16.03.2015, 10:13 | ||
|
Добавлено через 25 минут Хорошо, рассмотрим представленное вами нормализованное представление числа. Для мантиссы мы не будем использовать вещественные числа, а чтобы хранить мантиссу в числе целого типа будем изменять исходное число так, чтобы мантисса заняла всю отведенную под неё память. 19.99 = 1.999*101 пусть у нас ячейки памяти хранят десятичные числа и под мантиссу у нас 6 ячеек, тогда число в памяти будет иметь вид 0 01 1.99900 Здесь точка только для наглядности. Добавлено через 18 минут Т.е. если у нас есть число в нормализованном виде, то мы просто переписываем число в мантиссу начиная с первой ячейки. По сути, не сильно отличается от моего предыдущего предложения, поскольку если мы также пытаемся забить всю память под мантиссу значащими цифрами.
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 | ||
|
1
|
||
| 17.03.2015, 08:52 | |
|
Помогаю со студенческими работами здесь
20
Преобразование 64-битного числа в число с плавающей точкой Преобразование чисел с плавающей точкой в числа с фиксированной точкой Класс : Число с плавающей запятой(точкой) Добавить в класс возможность вычисления значенний с плавающей точкой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|