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

 
 
> С++, Домашка из универа
Злодей
сообщение 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
 
Start new topic
Ответов
ae_
сообщение Mar 18 2010, 16:14
Сообщение #2


Участник
***

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 28th July 2025 - 21:56
Рейтинг@Mail.ru


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