Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2010, 15:59   #1
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Мантисса и порядок. Страуструп.

Упражнение: "Напишите функцию, печатающую порядок и мантиссу параметра типа double."
Понимая что автор ( Страуструп) предполагает использование только пройденного материала, решил использовать обьединения 2.6.2 и поля 2.6.1. Идея такая: создаю структуру разбитую на поля подходящего размера (64 бита), объединяю с данными и использую каждое поле.
Код:
#include <iostream>

using namespace std;

void PrintDoubleStruct(double dblVal)
{
	struct DoubleStruct
	{
		unsigned uiMant2 : 32;
		unsigned uiMant1 : 20;
		unsigned uiExp : 11;
		unsigned uiSign : 1;
	};
	union Fudge
	{
		double dblVal;
		DoubleStruct DoubleStruct;
	};

	Fudge fd;
	fd.dblVal = dblVal;
	cout << "Value: " << fd.dblVal << "; Sign: " << (fd.DoubleStruct.uiSign ? '-' : '+') << "; Exp: " << (int)fd.DoubleStruct.uiExp - 1023;
	cout << endl;
}

int main()
{
	double dblVal;

	do
	{
		cin >> dblVal;
		PrintDoubleStruct(dblVal);
	}while(dblVal < 200);

	system("pause");
}
Вопросы:
1. Обязательно ли поле должно иметь целый тип?(Думаю да.)
2. Не зря ли я разбил мантиссу на две части?(Думаю выбора нет.)
3. Как теперь соединить эти части и напечатать мантиссу?(Нет мыслей).Прошу Вашей помощи.
KemanSR вне форума Ответить с цитированием
Старый 02.12.2010, 08:47   #2
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
Прошу Вашей помощи.
Хотя-бы ориентир подскажите или напишите чтобы глупых вопросов не задавал.
KemanSR вне форума Ответить с цитированием
Старый 02.12.2010, 11:27   #3
_Ang
Новичок
Джуниор
 
Регистрация: 02.12.2010
Сообщений: 3
По умолчанию

да, подскажите кто-нибудь я тоже мучаюсь над этой задачкой

http://en.wikipedia.org/wiki/Double_precision

Последний раз редактировалось Stilet; 02.12.2010 в 20:27.
_Ang вне форума Ответить с цитированием
Старый 02.12.2010, 13:33   #4
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Да, я Вики читал. Я незнаю как програмно "соединить" два поля "uiMant1" и "uiMant2". В "int" их нельзя - потеряются данные, только что прямо в "cout", но я непонимаю как выглядит мантисса.

Последний раз редактировалось KemanSR; 02.12.2010 в 13:35.
KemanSR вне форума Ответить с цитированием
Старый 02.12.2010, 17:46   #5
_Ang
Новичок
Джуниор
 
Регистрация: 02.12.2010
Сообщений: 3
По умолчанию

на самом деле, нас с тобой понесло в дебри)
мне тут сказали что в этом задании представлять мантиссу вроде необязательно в двоичном виде..
короче, все оказалось куда проще..
"Структура числа

Число с плавающей запятой состоит из:

* Мантиссы (выражающей значение числа без учёта порядка)
* Знака мантиссы (указывающего на отрицательность или положительность числа)
* Порядка (выражающего степень основания числа, на которое умножается мантисса)
* Знака порядка
−1 246 145 000 (минус один миллиард двести сорок шесть миллионов сто сорок пять тысяч): -1,246145 10^9; N = −1 246 145 000, M = −1,246145, n = 10, p = 9.

кажется это все что нужно вывести((((

но если ты в двоичном сможешь, то ты крут))

тебе int не хватает? а long? или long long??

мне больше интересно как определить максимальные и минимальные значения для char*, int*, void* из 8го задания

Последний раз редактировалось Stilet; 02.12.2010 в 20:27.
_Ang вне форума Ответить с цитированием
Старый 02.12.2010, 19:36   #6
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от _Ang Посмотреть сообщение
тебе int не хватает? а long? или long long??
Если Вы читали код первого сообщения то видели что мантисса занимает 20 + 32 = 52 бита, поэтому сохраняя её в "int" = 32 бита, я потеряю информацию (20 бит).
... хотя long long подходит... сейчас займусь. Спасибо!

Последний раз редактировалось KemanSR; 02.12.2010 в 19:38.
KemanSR вне форума Ответить с цитированием
Старый 02.12.2010, 19:49   #7
_Ang
Новичок
Джуниор
 
Регистрация: 02.12.2010
Сообщений: 3
По умолчанию

не забудь скинуть full-версию)

а что насчет 8го задания?
_Ang вне форума Ответить с цитированием
Старый 03.12.2010, 13:30   #8
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от _Ang Посмотреть сообщение
на самом деле, нас с тобой понесло в дебри)
мне тут сказали что в этом задании представлять мантиссу вроде необязательно в двоичном виде..
короче, все оказалось куда проще..
Это Вы у Страуструпа спросили? Автор явно "ведёт нас по одной линии" - это задание, как мне кажется, продолжение предыдущего. В предыдущем использовалось объединение, в этом задании необходимо работать с частями числа, вот предыдущий раздел(2.6.1) - наблюдается "ход мысли" автора.
Цитата:
Сообщение от _Ang Посмотреть сообщение
но если ты в двоичном сможешь, то ты крут))
Это не моя заслуга - это Страуструп любезно делится опытом.
Вот код, но последняя часть не закончена:
Код:
#include <iostream>

using namespace std;

int pow_two(int n)
{
	if ( n < 0 )
	{
		cout << "Negativ parameter." << endl;
		return 0;
	}
	switch ( n )
	{
	case 0: return 1;
	case 1: return 2;
	default: return 2 * pow_two(n-1);
	}
}

void PrintBinStr(unsigned iVal, char cQuanBits)
{
	for(int i = cQuanBits - 1; i >= 0; --i)
	{
		if(iVal & pow_two(i))
		{
			cout << '1';
		}
		else
		{
			cout << '0';
		}
	}
}

void PrintDoubleStruct(double dblVal)
{
	struct DoubleStruct
	{
		unsigned uiMant2 : 32;
		unsigned uiMant1 : 20;
		unsigned uiExp : 11;
		unsigned uiSign : 1;
	};

	union Fudge
	{
		double dblVal;
		DoubleStruct DoubleStruct;
	};

	Fudge fd;
	fd.dblVal = dblVal;

	cout << "Binary view:" << endl;
	PrintBinStr(fd.DoubleStruct.uiSign, 1);
	cout << ' ';
	PrintBinStr(fd.DoubleStruct.uiExp, 11);
	cout << ' ';
	PrintBinStr(fd.DoubleStruct.uiMant1, 20);
	PrintBinStr(fd.DoubleStruct.uiMant2, 32);
	cout << endl;

	cout << "Sign = " << fd.DoubleStruct.uiSign << "; Exp = " << fd.DoubleStruct.uiExp;

	long long llMant = fd.DoubleStruct.uiMant1;
	llMant <<= 32;
	llMant += fd.DoubleStruct.uiMant2;
	cout << "; Mant = " << llMant << ';' << endl;
// Но хотелось бы собрать, что то типа:
	cout << "I whant to format lake this:" << endl;
	cout << "Sign = " << (fd.DoubleStruct.uiSign ? '-' : '+') << "; Exp = " << (int)fd.DoubleStruct.uiExp - 1023;
	cout << "; Mant = ?.??; (Sample: 1.125)" << endl;
}

int main()
{
	double dblVal;
	cout << "For exit type value large then 200.0" << endl;
	do
	{
		cin >> dblVal;
		PrintDoubleStruct(dblVal);
	}while(dblVal < 200);

	system("pause");
}
Спасибо за внимание.
P.S. Попрошу заметить что я намеренно не уходил от материала (пример: функция pow_two(int n) - тоже из книги).
KemanSR вне форума Ответить с цитированием
Старый 03.12.2010, 13:50   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Я, конечно, немного не в тему, но может стоит вместо второго издания почитать третье? Как-никак язык сильно изменился с тех пор, да и объединения в наше время мало кому нужны кроме случаев глубокой оптимизации кода (в первую очередь обычно алгоритмы оптимизируют, а экономия памяти с помощью union'ов - один из последних этапов).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мантисса 6 разрядов mastar Помощь студентам 2 26.03.2011 18:10
Обратный порядок G. J. Cezar Общие вопросы C/C++ 2 22.10.2010 15:10
Перегрузка оператора [] (Страуструп) Ozerich Общие вопросы C/C++ 0 12.08.2010 13:06
[Delphi] | Порядок изучения Lemo Свободное общение 7 06.12.2009 19:52
Порядок OgE®_M@G Microsoft Office Excel 4 10.08.2008 01:45