Прошу
[code h=200]#include <conio.h>
#include <stdio.h>
//подпрограмма вывода бит вещественного числа
//параметры: адрес в памяти числа и число двойных слов
//подпрограмма универсальная: работает как с float, так и с double
//тип данных задается количеством двойных слов: 1 - для float, 2 - для double
void dvoich_vyvod(void *pData, int dwordKol)
{
unsigned int *pDw = (unsigned int *)pData;
int i, j;
char bits[64]; //строка бит числа (максимально 64)
unsigned int mask; //маска бита
int pos_znak; //индекс бита знака
int kol_eksp; //число бит экспоненты
int kol_mant; //число бит мантиссы
printf("Dvoich:");
//сделаем строку бит, младший - первым
for(i=0; i<dwordKol; i++) //циклим по двойным словам
{
mask = 1;
for(j=0; j<32; j++) //цикл по битам
{
if (pDw[i] & mask) //проверяем очередной бит
bits[i*32+j] = '1';
else
bits[i*32+j] = '0';
mask<<=1; //маска следующего бита
}
}
//вывод бит числа, начиная со старшего
j = dwordKol * 32; //количество бит числа
for(i=j-1; i>=0; i--) //начинаем с конца
{
if (0x07==(i&0x07)) //выведем пробел перед очередной восьмеркой бит
printf(" ");
printf("%c", bits[i]); //выводим очередной бит, как символ
}
printf("\n");
//выводим битовые поля числа
if (dwordKol == 1) //float
{
pos_znak = 31; //позиция знака
kol_eksp = 8; //число бит экспоненты
kol_mant = 23; //число бит мантиссы
}
else //double
{
pos_znak = 63; //позиция знака
kol_eksp = 11; //число бит экспоненты
kol_mant = 52; //число бит мантиссы
}
printf("Znak (1):\t%c", bits[pos_znak]); //знак
printf("\nExponenta (%d):\t", kol_eksp); //экспонента
for(i=0; i<kol_eksp; i++)
printf("%c", bits[pos_znak-i-1]); //биты экспоненты
printf("\nMantissa (%d):\t", kol_mant); //мантисса
for(i=0; i<kol_mant; i++)
printf("%c", bits[kol_mant-i-1]); //биты мантиссы
printf("\n\n");
}
int main()
{
float eps_float_1 = 1.0,
eps_float = 1.0,
nol_float = 1.0,
nol_float_1 = 1.0;
double eps_double_1 = 1.0,
eps_double = 1.0,
nol_double = 1.0,
nol_double_1 = 1.0;
do{ //Вычисление машинного эпсилона для float
eps_float_1 = eps_float_1/2;
eps_float = eps_float_1 + 1;
}
while (eps_float>1);
eps_float = eps_float_1*2;
do{ //Вычисление машинного эпсилона для double
eps_double_1 = eps_double_1/2;
eps_double = eps_double_1 + 1;
}
while (eps_double>1);
eps_double = eps_double_1*2;
do{ //Вычисление машинного нуля для float
nol_float_1 = nol_float;
nol_float = nol_float/2;
}
while (nol_float>0);
nol_float=nol_float_1;
do{ //Вычисление машинного нуля для double
nol_double_1 = nol_double;
nol_double = nol_double/2;
}
while (nol_double>0);
nol_double=nol_double_1;
//результаты расчета
//машинный эпсилон float
printf("Machiniy epsilon FLOAT:\t%.30e\n", eps_float);
dvoich_vyvod(&eps_float, 1);
//машинный эпсилон double
printf("Machiniy epsilon DOUBLE:\t%.30e\n", eps_double);
dvoich_vyvod(&eps_double, 2);
//машинный ноль float
printf("Machiniy nol FLOAT:\t%.30e\n", nol_float);
dvoich_vyvod(&nol_float, 1);
//машинный ноль double
printf("Machiniy nol DOUBLE:\t%.30e\n", nol_double);
dvoich_vyvod(&nol_double, 2);
getch();
return 0;
}[/code]