Эмуляция

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
regromus
Сообщения: 12
Зарегистрирован: 10 мар 2005, 14:28
Откуда: Владивосток

8) Прошу помочь решить задачу
Написать ф-ю, которая на входе имеет 2 числа с плавающей точкой типа FLOAT, но представленные как LONG INT UNSIGNED ивыдаёт результат типа FLOAT.Сумма или разность - 3ий операнд.
8)
Hup
Сообщения: 207
Зарегистрирован: 05 мар 2004, 05:31
Откуда: Владивосток
Контактная информация:

Какая-то задача притянутая за уши.
Поподробнее плз.
Усложнять - легко, упрощать - сложно
regromus
Сообщения: 12
Зарегистрирован: 10 мар 2005, 14:28
Откуда: Владивосток

Канает такая подсказка:

в unsigned long int помещается число типа float в следующем виде:

Код: Выделить всё

struct {
 unsigned int <До запятой>;
 unsigned int <После запятой>;
}

запятая, естественно, отбрасывается.
После этого производится операция над двумя переданными числами (сложение отдельно того, что до запятой, и того, что после запятой) и складывается обратно (запятая вставляется в нужное место), например, через массив символов и atof()... 8)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну если число с плавающей запятой в данной текущей задаче запаковано именно так (конечно же это не системное представление), то алгоритм следующий.

Целые части просто складываем и записываем в целую часть результата. Дробные части сначала выравниваем (то бишь умножаем на 10 соответствующее число до тех пор, пока числа не станут одного порядка) и тоже складываем. Если результат отличается порядком от слагаемых, отбрасываем старшую цифру и инкрементируем целую часть результата, после этого получившееся число записываем в дробную часть результат. Всё.

P.S. Порядок числа (иными словами количество знаков) можно вычислить по следующей формуле:
<Целая часть>(log10 (Число)) + 1.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

в unsigned long int помещается число типа float в следующем виде:
Ни фига это не float. Ни в каком приближении. Если тебе это надо как ты написал, то надо писать "число с фиксированной запятой".
А складывать их лучше как числа типа long long или _int64.
2B OR NOT(2B) = FF
regromus
Сообщения: 12
Зарегистрирован: 10 мар 2005, 14:28
Откуда: Владивосток

Короче понятно , что нифига не понятно. Если кто знает как решать оригинал то HELP.
Hup
Сообщения: 207
Зарегистрирован: 05 мар 2004, 05:31
Откуда: Владивосток
Контактная информация:

--------------------------------------------------------------------------
А разве нельзя все сложить попарно, потом загнать в строки(и добавить между ними запятую) и весь получившийся каламбур переконвертировать в float/
--------------------------------------------------------------------------

Сначала написал, а потом подумал :) Отпадает. Этот алгоритм гораздо сложнее, чем предложил Romeo и чем кажется на первый взгляд/ Да и вообще не ясно, можно ли его реализовать.
Усложнять - легко, упрощать - сложно
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

regromus, тебе не понравилось моё решение? Или тебе нужны ещё варианты? Могу тебя обрадовать: вариантов больше нет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить