2011-06-18 08:23:31Morris
b054. 第五題:浮點數的表示式
http://zerojudge.tw/ShowProblem?problemid=b054
內容 :
有一系統將浮點數放在4個位元組的記憶體中,其表示方法如下:
第一位元組 | 8位元表示指數,若此數為正,則取後7位元為指數值。 若此數為負,則取其2的補數為指數值。 |
第二位元組 | 其中第一個位元為該浮點數之正負符號(0代表正,1代表負),第二位元組的後7位元和第三、四位元組的16個位元合成23位元的浮點數 |
若該數值為10其內含值為H84、H20、H00、H00
若該數值為 -0.05其內含值為H7C、HCC、HCC、HCD
請設計一程式,輸入一數值會顯示出:
1.輸入之10進位值
2.四個位元組的二進位值
3.四個位元組的十六進位值
4.二進位的浮點數格式
5.浮點數的十進位值
輸入說明
:
輸出說明
:
範例輸入 :
10 0.05 -10 -20.125
範例輸出 :
Input a value: 10 Exponent lst byte 2nd byte 3rd byte Memory Contents= 10000100 00100000 00000000 00000000 <&H84> <&H20> <&H00> <&H00> FLOATING POINT FORMAT => 0.101000000000000000000000 * 2 ^ 4 Floating Point Value = 10 ================================================================= Input a value: 0.05 Exponent lst byte 2nd byte 3rd byte Memory Contents= 01111100 01001100 11001100 11001100 <&H7C> <&H4C> <&HCC> <&HCC> FLOATING POINT FORMAT => 0.110011001100110011001100 * 2 ^ -4 Floating Point Value = 0.05 ================================================================= Input a value: -10 Exponent lst byte 2nd byte 3rd byte Memory Contents= 10000100 10100000 00000000 00000000 <&H84> <&HA0> <&H00> <&H00> FLOATING POINT FORMAT => -0.101000000000000000000000 * 2 ^ 4 Floating Point Value = -10 ================================================================= Input a value: -20.125 Exponent lst byte 2nd byte 3rd byte Memory Contents= 10000101 10100001 00000000 00000000 <&H85> <&HA1> <&H00> <&H00> FLOATING POINT FORMAT => -0.101000010000000000000000 * 2 ^ 5 Floating Point Value = -20.125 =================================================================
提示
:
出處
:
96高市資訊學科能力競賽
作法 : 模擬
指導 by taichunmin,下面是基礎看位址的程式碼
#include<iostream>
using namespace std;
main() {
double x;
unsigned long long * n;
while(cin>>x)
{
n=(unsigned long long*)&x;
cout<<"SE=========EM==================================================M"<<endl;
for(int i=63;i>=0;i--)
printf("%d", ((*n) >> i)&1);
puts("");
for(int i=63;i>=0;i--)
printf("%d",i%10);
puts("");
for(int i=63;i>=0;i--)
printf("%c",(i%10!=0)?' ':('0'+i/10));
cout<<endl;
}
}
作法 : 模擬
指導 by taichunmin,下面是基礎看位址的程式碼
#include<iostream>
using namespace std;
main() {
double x;
unsigned long long * n;
while(cin>>x)
{
n=(unsigned long long*)&x;
cout<<"SE=========EM==================================================M"<<endl;
for(int i=63;i>=0;i--)
printf("%d", ((*n) >> i)&1);
puts("");
for(int i=63;i>=0;i--)
printf("%d",i%10);
puts("");
for(int i=63;i>=0;i--)
printf("%c",(i%10!=0)?' ':('0'+i/10));
cout<<endl;
}
}
/**********************************************************************************/
/* Problem: b054 "第五題:浮點數的表示式" from 96高市資訊學科能力競賽*/
/* Language: C */
/* Result: AC (4ms, 316KB) on ZeroJudge */
/* Author: morris1028 at 2011-06-17 21:52:36 */
/**********************************************************************************/
#include<stdio.h>
void change(int n) {
int a;
printf(" ");
for(a = 7; a >= 0; a--)
printf("%d", (n >> a) &1);
}
main() {
double n;
float n2;
int C = 0;
unsigned long long * m, * m2;
while(scanf("%lf", &n) == 1) {
int a, t1 = 0, t2 = 0, t3 = 0, t4 = 0;
n2 = (float)n;
m = (unsigned long long *) &n;
for(a = 62; a >= 52; a--)
t1 |= ((((*m) >> a)&1) << (a-52));
t1 -= 894;
t2 = (((*m) >> 63) &1)<<7;
for(a = 6; a >= 0; a--)
t2 |= ((((*m) >> (a+45))&1) << a);
for(a = 7; a >= 0; a--)
t3 |= ((((*m) >> (a+37))&1) << a);
for(a = 7; a >= 0; a--)
t4 |= ((((*m) >> (a+29))&1) << a);
printf("Input a value: %g\n", n);
puts(" Exponent lst byte 2nd byte 3rd byte");
printf("Memory Contents=");
change(t1), change(t2), change(t3), change(t4);
printf("\n <&H%2.2X> <&H%.2X> <&H%.2X> <&H%.2X>\n", t1, t2, t3, t4);
printf("FLOATING POINT FORMAT =>");
printf("%s0.1", (n >= 0) ? " " : " -");
for(a = 22; a >= 0; a--)
printf("%d",((*m) >> (a+29))&1);
printf(" * 2 ^ %d", t1-128);
printf("\nFloating Point Value = %g\n", n);
puts("=================================================================");
}
return 0;
}
上一篇:b061. 6. 糊塗情報員
下一篇:d451. 科學記號
(悄悄話)
2011-06-18 10:36:34