2013年7月23日 星期二

1530 - Floating Point Numbers

浮點數表示法,在電腦中採用二進制的科學記號表示法,假設這裡有台電腦使用 16-bit 的表示方法如下圖一:

 
 
在最常見的 Intel 晶片中,使用的 float 指數(exponent)具有 8 bits,而尾數(mantissa)具有 23 bits,而其餘的晶片都跟圖一使用的一樣。


舉個十進制的例子 -10.375:

如果該數是正的,則 sign bit 或是 1,反之 0。而接下來 7 個 bits,(例子中使用 1000010),表示二進制科學記號的指數次方,而處理步驟如下,得到實際次方:



  • 計算二進制的值 10000101*64+0*32+0*16+0*8+0*4+1*2+0*1 = 66.
  • 並且減去 63,就會得到指數部分, 這種方式是為了使用負數的次方關係。
  • 接著繼續計算尾數(mantissa)部分,假設數字表示成二進制科學記號,如下圖二,分別對應三個欄位(sign, mantissa, exponent)如下:




  • 尾數部分指得是在小數點之後的部分(補充說明:小數點之前稱作首數)。
  • 由於是二進制科學記號,因此首數一定為 1,除了 0 的表示法比較特別外,因此只會使用尾數記錄。
  • 因此二進制如圖二中的可以對照十進制的科學記號:

    $$-(1+2^{-2}+2^{-5}+2^{-6}) * 2^{3} = -10.375 = -1.0375 * 10^{1}$$

    而在程式語言中,通常表示格式如 -1.0375e+001,使用小寫 "e" 或者大寫 "E" 表示指數次方。而當所有 bits(忽略 sign bit) 皆為 0 時,用來表示 0。

    Input 

    輸入有多組測資,每一行將會有長度為 16 的字串,只會由 0 跟 1 夠成。
    第一個字元表示 sign bit,接下來七個字元表示 exponent,剩餘的表示 mantissa。

    Output 

    在程式開始前輸出一行 "Program 6 by team X"。

    對於每組測資輸出一行,格式如下:



  • 使用十進制的科學符號表示法。
  • 在 Column 1 中,如果是正數則輸出空白,負數則輸出一個減號 "-"。
  • 在 Column 2 中,輸出一個位數。
  • 在 Column 3 中,有一個小數點。
  • 在 Columns 4 - 9 中,表示 6 位的浮點數精準度。
  • 而剩餘的部分表示指數,確切的格式請參考範例測資。
  • 程式結束前,輸出一行 "End of program 6 by team X" 。

    特別注意,內建的表示法將根據不同語言而有所不同,建議在此題不要使用。

    Sample Input 

    1100001001001100
    0011111100000000
    1011111110000000
    0000000010101010
    0011011111100000
    1001111011100000
    0101011001010101
    0100011011101101
    0111111111111111
    1100001000101100
    0000000000000000
    1000000000000000
    

    Sample Output 

    Program 6 by team X
    -1.037500e+001
     1.000000e+000
    -1.500000e+000
     1.804180e-019
     7.324219e-003
    -2.182787e-010
     1.117389e+007
     2.465000e+002
     3.682143e+019
    -9.375000e+000
     0.000000e+000
     0.000000e+000
    End of program 6 by team X