реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> С++, Домашка из универа
Злодей
сообщение Mar 18 2010, 09:30
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Цитата
Написать класс MyReal, внутри класса хранить в интах целую и дробную часть числа, определить операторы + - * / ,...

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


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

bb-offtopic.gif
Может правильнее забить на изобретение нового формата числа, и учить ООП на животных?

Сообщение отредактировал Злодей - Mar 18 2010, 09:42
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Mar 18 2010, 10:02
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



1. Ну целая часть это инт сам по себе. А дробная. Тут надо понимать, что дробную часть вы представите с точностью не лучше 2^-32 если инт это 32 бита (знак тут не нужен, поэтому уинт).Ну вот и понимайте как 0,5 это 0,5*2^32 = 2^31 То есть если в вашей дробной части, которая представлена интом хранится число 2^32, например, это значит, что там на самом деле 0,5.
2. Как бы вы в уме сложили 2,7 и 3,6? Складываются дробные части, если они переполняют единицу, то к сумме целых прибавляется 1.
3. Ну это уж как сделаете. Перепичывать с нуля при номальном дизайне не придется, просто вызвать родителя + добавить функционал обработки переполнения.
4. Не знаю.
Причина редактирования: Бездумное цитироване
Go to the top of the page
 
+Quote Post
Злодей
сообщение Mar 18 2010, 11:05
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Спасибо!

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

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


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

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

Вот следующее задание нормальное - вектор. Т.е. с меня требую функционал, я его реализую.

Сообщение отредактировал Злодей - Mar 18 2010, 11:06
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 18 2010, 11:16
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



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


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


Что значит "Достаточно ли этого, чтобы отказаться от задания"?


--------------------
Go to the top of the page
 
+Quote Post
Злодей
сообщение Mar 18 2010, 11:35
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Задание дал преподаватель. Отказаться в прямом смысле.
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 18 2010, 11:39
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(Злодей @ Mar 18 2010, 14:35) *
Отказаться в прямом смысле.


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


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

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

 


--------------------
Go to the top of the page
 
+Quote Post
Злодей
сообщение Mar 18 2010, 12:32
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



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

Если int8 целая и uint8 дробная. 2.6 + 3.7: Целые части сложились, а дробные: 255*.6 + 255*.7 = 315/255. Один битик уже не влез... Перед перемножением, нужно будет приводить к типам, размером большим в сколько-то раз, чтоли...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 18 2010, 13:32
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ни от чего не нужно отказываться!
Надо делать.
В реаьной жизни потом такие "ТЗ" и документации будут попадаться, что эта задачка покажется бальзамом на душу smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
ae_
сообщение Mar 18 2010, 16:14
Сообщение #9


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(Злодей @ 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.0175 секунд с 7
ELECTRONIX ©2004-2016