L - Floating-Point Numbers
L - Floating-Point Numbers
题目大意:题目向我们解释了浮点数在计算机中的储存方式,分为三部分,第一部分表示符号正负(0为正,1为负),第二部分为尾数M,第三部分为阶码E,在计算机中用二进制表示M和E的时候如果位数不同,那么它们所能表示的最大值也不同。题目要求我们将输入的十进制的指数形式的数转化为二进制表示,求出尾数M和阶码E。
借鉴了别人的思想,写了下。
代码如下。
#include<bits/stdc++.h>
using namespace std;
int i, j;
double a[10][31],m[10],e[31];
void init()
{
for (i = 0;i < 10;i++)
m[i] = 1 - pow(0.5, (i + 1));//计算m
for (j = 1;j < 31;j++)
e[j] = pow(2,j) - 1;//计算e
for (i = 0;i < 10;i++)
for (j = 1;j < 31;j++)
a[i][j] = log10(m[i]) + e[j] * log10(2);//枚举
}
int main()
{
init();
double A,t;//A为t的小数部分,t为十进制转化为二进制取对数后的值
int B;//B为t的整数部分
char s[25];
while(cin>>s)
{
for (i = 0;;i++)
if (s[i] == 'e')
{
s[i] = ' ';
break;
}//将e置空是为了方便读入A和B
sscanf(s, "%lf %d", &A, &B);
if (!A&&!B) break;
t = log10(A)+B;
for (i = 0;i < 10;i++)
for (j = 1;j < 31;j++)
if (fabs(a[i][j] - t) < 1e-4) goto loop;//允许实际误差<10^(1e-4)
loop:
cout<<i<<" "<<j<<endl;
}
return 0;
}