Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10908
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3991
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2050
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1788
Дата выхода:13.05.2013, 19:30
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:86 / 57
Вопросов / ответов:1 / 1

Консультация # 187325: Здравствуйте! У меня возникли сложности с таким вопросом: Написать программу на С для отыскания значений машинного нуля и машинного эпсилон. с комментариями. С выводом, сколько разрядов на мантиссу и экспоненту. При этом нужно 2 разных варианта программы. В плане чтоб не было понятно что писал 1 человек или скопированы с минимальными ...


Консультация # 187325:

Здравствуйте! У меня возникли сложности с таким вопросом:

Написать программу на С для отыскания значений машинного нуля и машинного эпсилон. с комментариями. С выводом, сколько разрядов на мантиссу и экспоненту.

При этом нужно 2 разных варианта программы. В плане чтоб не было понятно что писал 1 человек или скопированы с минимальными изменениями

Дата отправки: 10.05.2013, 19:01
Вопрос задал: Посетитель - 397042 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 397042!
Предлагаю вот такой вариант реализации:

Код :
#include <conio.h>
#include <stdio.h>

//подпрограмма вывода бит вещественного числа, как последовательности байт
//параметры: адрес в памяти числа и число байт
//подпрограмма универсальная: работает как с float, так и с double
//тип данных задается количеством байт: 4 - для float, 8 - для double
//корректность параметра не проверяется!
void binary_print(unsigned char *pData, int iCount)
{
	int				i, j, k;
	char			A[64];		//буфер для формирования последовательности бит 0/1 (максимально 64)
	unsigned char	ch;			//для приема очередного байта
	int				iPosSign;	//позиция знака в буфере
	int				iExpCount;	//количество бит экспоненты
	int				iManCount;	//количество бит мантиссы

	printf("Binary:");			//начинаем вывод...
	
	//сформируем строку - последовательность бит, начиная с младшего.
	for(k=i=0; i<iCount; i++)	//циклим по байтам, k - позиция в буфере с байтами(битами)
	{
		ch = pData[i];			//очередной байт числа
		for(j=0; j<8; j++)		//цикл по битам байта ch,  
		{
			A[k++] = (ch & 1) + '0';	//добавляя к младшему биту '0', получим '0' или '1'
			ch>>=1;						//следующий бит делаем младшим
		}
	}
	
	//выводим все биты, в обратном порядке, начиная со старшего
	for(i=(iCount<<3)-1; i>=0; i--)		//(iCount<<3)   - количество бит в числе,  
	{									//(iCount<<3)-1 - индекс самого старшего (знакового) бита
		if (7==(i&7))					//условие для вывода пробела ПЕРЕД очередной восьмеркой бит
			printf(" ");				//пробел для читабельности
		printf("%c", A[i]);				//выводим очередной бит, как символ
	}
	
	//выводим битовые поля числа
	if (iCount == 4)					//для типа float
	{
		iPosSign = 31;					//индекс бита знака
		iExpCount = 8;					//количество бит экспоненты
		iManCount = 23;					//количество бит мантиссы
	}
	else								//для типа double
	{
		iPosSign = 63;					//индекс бита знака
		iExpCount = 11;					//количество бит экспоненты
		iManCount = 52;					//количество бит мантиссы
	}
	printf("\nSign (1 bit):\t\t%c", A[iPosSign]);	//знак
	printf("\nExponent (%d bits):\t", iExpCount);	//экспонента
	for(i=0; i<iExpCount; i++)
		printf("%c", A[iPosSign-i-1]);				//биты экспоненты
	printf("\nMantissa (%d bits):\t", iManCount);	//мантисса
	for(i=0; i<iManCount; i++)
		printf("%c", A[iManCount-i-1]);				//биты мантиссы
	printf("\n\n");						//переход на новую строку и вывод еще одной пустой строки 
}

int main()
{
		float	eps_float_vspom = 1.0, 
				eps_float = 1.0, 
				nol_float = 1.0, 
				nol_float_vspom = 1.0;
        double	eps_double_vspom = 1.0, 
				eps_double = 1.0, 
				nol_double = 1.0, 
				nol_double_vspom = 1.0;
        
		do								//Вычисление машинного эпсилона типа  float
		{
			eps_float_vspom = eps_float_vspom/2;
			eps_float = eps_float_vspom + 1;
		}while (eps_float>1);
		eps_float = eps_float_vspom*2;
		
		do								//Вычисление машинного эпсилона типа  double
        {
			eps_double_vspom = eps_double_vspom/2;
			eps_double = eps_double_vspom + 1;
        }while (eps_double>1);
        eps_double = eps_double_vspom*2;
        
		do								//Вычисление машинного нуля типа  float
		{
			nol_float_vspom = nol_float;
			nol_float = nol_float/2;
		}while (nol_float>0);
        nol_float=nol_float_vspom;
        
		do								//Вычисление машинного нуля типа double
        {
			nol_double_vspom = nol_double;
			nol_double = nol_double/2;
		}while (nol_double>0);
        nol_double=nol_double_vspom;
        
		//вывод результатов расчета
		printf("Machine epsilon FLOAT:\t%.30e\n", eps_float);
        binary_print((unsigned char*)&eps_float, 4);
        
		printf("Machine epsilon DOUBLE:\t%.30e\n", eps_double);
		binary_print((unsigned char*)&eps_double, 8);
        
		printf("Machine nul FLOAT:\t%.30e\n", nol_float);
		binary_print((unsigned char*)&nol_float, 4);
        
		printf("Machine nul DOUBLE:\t%.30e\n", nol_double);
		binary_print((unsigned char*)&nol_double, 8);
        
        getch();
        return 0;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 12.05.2013, 22:56
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное