24h購物| | PChome| 登入
2011-06-18 08:23:31| 人氣1,543| 回應1 | 上一篇 | 下一篇

b054. 第五題:浮點數的表示式

推薦 0 收藏 0 轉貼0 訂閱站台

http://zerojudge.tw/ShowProblem?problemid=b054

內容 :

有一系統將浮點數放在4個位元組的記憶體中,其表示方法如下:

 

第一位元組

8位元表示指數,若此數為正,則取後7位元為指數值。

若此數為負,則取其2的補數為指數值。

第二位元組
第三位元組

其中第一個位元為該浮點數之正負符號(0代表正,1代表負),第二位元組的後7位元和第三、四位元組的16個位元合成23位元的浮點數

若該數值為10其內含值為H84H20H00H00

 

若該數值為 -0.05其內含值為H7CHCCHCCHCD

 

請設計一程式,輸入一數值會顯示出:

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;
    }
}


/**********************************************************************************/
/*  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;
}

台長: Morris
人氣(1,543) | 回應(1)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 資訊競賽 |
此分類下一篇:d451. 科學記號
此分類上一篇:b061. 6. 糊塗情報員

(悄悄話)
2011-06-18 10:36:34
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文