Представление числа с плавающей точкой
Все вопросы можно задавать по адресу staroverovvl@yandex.ru
В качестве программы, работающей с бинарными операциями, приведем пример программы,
показывающей битовое представление вещественных чисел, являющихся степенью двойки.
void PrintBitsF(float v)
{int b,i,j,k=0;
for(i=3;i>=0;i--)
for(j=7;j>=0;j--)
{
b=(((((unsigned char*)&v)[i])&(1<<j))?1:0);
printf("%1.1d",b);
if(k==0||k==8)printf(" ");
k++;
}
}
void PrintBitsD(double v)
{int b,i,j,k=0;
for(i=7;>=0;i--)
for(j=7;>=0;j--)
{
b=(((((unsigned char*)&v)[i])&(1<<j))?1:0);
printf("%1.1d",b);
if(k==0||k==11)printf(" ");
k++;
}
}
int main(int argc,const char **argv)
{
{float v=1,v1;int i=sizeof(1.f+v);
printf("sizeof(1.f+v)=%d\n",i);
for(i=0;i<153;i++)
{
printf("%5d:%15g ",i,v);
PrintBitsF(v);
v1=1.f+v;
printf(" 1%s1+v 1%s1+v ",(v1==1.f?"==":"!="),(1.f+v==1.f?"==":"!="));
printf("\n");
v/=2;
}
printf("Press ENTER...");getchar();
}
{double v=1,v1;int i=sizeof(long double);
for(i=0;i<1076;i++)
{
if(i<59||i>1000)
{
printf("%5d:%15lg ",i,v);
PrintBitsD(v);
v1=1.f+v;
printf(" 1%s1+v 1%s1+v ",(v1==1.f?"==":"!="),(v+1.f==1.f?"==":"!="));
printf("\n");
}
v/=2;
}
printf("Press ENTER...");getchar();
}
return 0;
}