|
|
  |
С++, Домашка из универа |
|
|
|
Mar 18 2010, 09:30
|

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

|
Цитата Написать класс MyReal, внутри класса хранить в интах целую и дробную часть числа, определить операторы + - * / ,... И продолжение Цитата Написать наследника класса MyReal, с предотвращением переполнения числа 1. Как представить число в виде дробной и целой части интами, да чтоб с ними можно было работать? 2. Как работать с числом если оно есть два инта? Как, например, сложить два числа, составленных из целой/дробной части? 3. Пускай наследник MyReal, следящий за переполнением называется MyRealOF. Должен ли я буду перегружать каждый оператор, переписывать с почти с нуля, или можно слежение за переполнением добавить красиво и всего в единственном месте? 4. Как написать ассемблерную вставку чтения OverflowFlag? (Ничего больше не придумал) Может правильнее забить на изобретение нового формата числа, и учить ООП на животных?
Сообщение отредактировал Злодей - Mar 18 2010, 09:42
|
|
|
|
|
Mar 18 2010, 10:02
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 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. Не знаю.
Причина редактирования: Бездумное цитироване
|
|
|
|
|
Mar 18 2010, 11:05
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 18 2010, 11:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(Злодей @ Mar 18 2010, 14:35)  Отказаться в прямом смысле. А, в прямом смысле... Достаточно оснований с юридической точки зрения, чтобы отказаться от задания в университете? Или с точки зрения здравого смысла?
--------------------
|
|
|
|
|
Mar 18 2010, 16:14
|
Участник
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|