Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С++
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Злодей
Цитата
Написать класс MyReal, внутри класса хранить в интах целую и дробную часть числа, определить операторы + - * / ,...

И продолжение
Цитата
Написать наследника класса MyReal, с предотвращением переполнения числа


1. Как представить число в виде дробной и целой части интами, да чтоб с ними можно было работать?
2. Как работать с числом если оно есть два инта? Как, например, сложить два числа, составленных из целой/дробной части?
3. Пускай наследник MyReal, следящий за переполнением называется MyRealOF. Должен ли я буду перегружать каждый оператор, переписывать с почти с нуля, или можно слежение за переполнением добавить красиво и всего в единственном месте?
4. Как написать ассемблерную вставку чтения OverflowFlag? (Ничего больше не придумал)

bb-offtopic.gif
Может правильнее забить на изобретение нового формата числа, и учить ООП на животных?
jorikdima
1. Ну целая часть это инт сам по себе. А дробная. Тут надо понимать, что дробную часть вы представите с точностью не лучше 2^-32 если инт это 32 бита (знак тут не нужен, поэтому уинт).Ну вот и понимайте как 0,5 это 0,5*2^32 = 2^31 То есть если в вашей дробной части, которая представлена интом хранится число 2^32, например, это значит, что там на самом деле 0,5.
2. Как бы вы в уме сложили 2,7 и 3,6? Складываются дробные части, если они переполняют единицу, то к сумме целых прибавляется 1.
3. Ну это уж как сделаете. Перепичывать с нуля при номальном дизайне не придется, просто вызвать родителя + добавить функционал обработки переполнения.
4. Не знаю.
Злодей
Спасибо!

Пытаюсь c = a * b. Перемножил целые/дробные между собой:

Код
a.целая * b.целая;
a.fract * a.дробн;
a.целая * b.дробн;
b.целая * a. дробн;


Теперь нужно эти четыре числа распределить по c.целая и c.дробн... Я вот даже не знаю, что попробовать посчитать в эксельке...

P.S:
Кажется понял: В "Т.З." на разработку класса указано, на каких private полях я должен его построить. Достаточно ли этого, чтобы отказаться от задания?

Вот следующее задание нормальное - вектор. Т.е. с меня требую функционал, я его реализую.
des333
Цитата(Злодей @ Mar 18 2010, 14:05) *
P.S:
Кажется понял: В "Т.З." на разработку класса указано, на каких private полях я должен его построить. Достаточно ли этого, чтобы отказаться от задания?


Что значит "отказаться от задания"? Кто задал Вам задание? 


Что значит "Достаточно ли этого, чтобы отказаться от задания"?
Злодей
Задание дал преподаватель. Отказаться в прямом смысле.
des333
Цитата(Злодей @ Mar 18 2010, 14:35) *
Отказаться в прямом смысле.


А, в прямом смысле...


Достаточно оснований с юридической точки зрения, чтобы отказаться от задания в университете?

Или с точки зрения здравого смысла?

 
Злодей
Здравого смысла, т.е. по двум причинам:
1. Задание оговаривает внутреннее устройство класса, обсуждает мои private поля. А про назначение сущность, которую он должен представлять, сказано только "вещественное число". Так нельзя.
2. У такого типа числа нет преимуществ перед float... Так себе повод...

Если int8 целая и uint8 дробная. 2.6 + 3.7: Целые части сложились, а дробные: 255*.6 + 255*.7 = 315/255. Один битик уже не влез... Перед перемножением, нужно будет приводить к типам, размером большим в сколько-то раз, чтоли...
sigmaN
Ни от чего не нужно отказываться!
Надо делать.
В реаьной жизни потом такие "ТЗ" и документации будут попадаться, что эта задачка покажется бальзамом на душу smile.gif
ae_
Цитата(Злодей @ Mar 18 2010, 20:32) *
... Если int8 целая и uint8 дробная. 2.6 + 3.7: Целые части сложились, а дробные: 255*.6 + 255*.7 = 315/255. Один битик уже не влез... Перед перемножением, нужно будет приводить к типам, размером большим в сколько-то раз, чтоли...

Как работать с десятичными дробями, если есть только целочисленная арифметика? Как сложить 2.6+3.7 если есть переменные, которые могут хранить только целые числа и все арифметические операции тоже только над целыми числами? Очень просто - нужно десятичную точку сделать виртуальной. Вместо 2.6+3.7=6.3 делаем 2.6*100+3.7*100=630 нужно только помнить, что в результате есть виртуальная десятичная точка, отделяющая целую часть от дробной (два младших разряда).
Как то же самое сделать в двоичной системе? - точно так же. 2.6*256=0x0299, где 0x02 - это целая часть, а 0х99 - дробная (0х99/256=0.59765625) которые хранятся в разных uint8. второе слагаемое 3.7*256=0x03B3, 3 - целая часть, 0xB3 дробная (0xB3/256=0.69921875). Складываем 0x0299 + 0x03B3 = 0x064C, смотрим, что получилось 0х06 - целое=6, дробная часть 4С/256=0.296875, т.е. в полном виде 6.296875, что немного отличается от 6.3 из-за неточного представления дробей в uint8.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.