« November 2010 | Main | April 2013 »

February 02, 2013

【応用情報】 基礎理論-浮動小数点1

■2進数の浮動小数点

<<問題1>>(サンプル:平成18年出題)

18_

10進数などの浮動小数点の表現
と語句の対応は同じですから参考にします。
符号部S 、基数2(決まっているからビット列中に書かない) および ビット列(BOX)の配列順序(じゅんばん)は IEEE方式 も同じです。大きな違いは 指数部で負数を2の補数で表すところでしょう。正規化は仮数部が始めから0がダラダラ連続(^○^)することがないように有効ケタを増やす操作です。IEEE方式も独自の正規化を行っています。

 <<解答>>説明です。
10進 0.25 は 2進数で 0. 01。これを
正規化すると 0. 1×2 -1(等式として)。
指数部eの4ビットは -1を2の補数表現で、0001→ (反転)1110 →(1をたす)  1111。
仮数部 f 11ビットは 100 0000 0000。 
符号部1ビットは正の数でS=0。
従って
 0 / 1111 / 100 0000 0000 (答ウ)。

<<問題2>>

注1 数の絶対値とは 、その数から符号を取り去ったもの。たとえば +5 の絶対値、 - 5 の絶対値は いずれも 5 である。数学の教科書などには A の絶対値を記号|A|で表し、A≧0のとき|A|=A 、A<0のとき|A|=-A。 などの説明があるが、たいへん難しいと思います。
注2  32ビット列で表す単精度形式の他に、IEEE方式では64ビット列で表す倍精度(ばいせいど)形式という浮動小数点も用意されている。 相違点(ちがうこと)は、① 符号部 1ビット、指数部  11ビット、仮数部 52ビットの合わせて 64ビットで表示する。 ② 指数部のゲタはきは 1023をたす。 の2点です。ゲタ 1023 は2進の 11 1111 1111 または 210 - 1 = 100 0000 0000 - 1 と考えれば納得ですか。

<<回答>>>
(1)

ア) 符号部:0 正の数、指数部: 1、仮数部 0. 5  → 2 1×0. 5 = 1  
イ)符号:正の数、指数部:1001 は 0111= 7(10)の補数表示、仮数: 0. 5
   → 2 -7×0. 5 = 0. 00390625 (有限小数)
 
エ)負数 -2 1×0. 5 = - 1

(2)

① 5. 75= 101. 11(10) = 1. 0111×2 2  
   符号部: 0、指数部: 2 + 127(ゲタ) = 1000 0001、仮数部: 整数 1 捨てて 01110000…0 (23ビット)
  故に、 0 / 1000 0001 / 011 1000 0000 0000 0000 0000
② 80 = 2 6+2 4 = 1010000 = 1. 01× 2 6 
   符号部 : 1 (負数)、指数部: 6+127 = 1000 0101 、仮数部: 0100000…0 (23ビット)
  故に 1 / 1000 0101 / 010 0000 0000 0000 0000 0000 

勉強会ネタ

| | Comments (0) | TrackBack (0)

【応用情報】 基礎理論-数値変換

■固定小数形式と浮動小数形式

いつものように、まず10進数で小数の表現方法を考えてみましょう。小数とは、小数点を意味するドット(.)を持つ数のことです。当たり前のことですが、図1のようにドットの左側に1以上の数を書き、ドットの右側に1未満の数を書きます。小数点は、1以上の桁と1未満の桁の境目を表す記号だと言えます。

このような表現方法を「固定小数形式(こていしょうすうてんすうけいしき)」と呼びます。小数点の位置が、その左右で1より大きいかどうかを表す固定的な境目となっているからです。



小数の表現方法は、もう一つあります。それは「浮動小数形式(ふどうしょうすうてんすうけいしき)」と呼ばれるものです。図2に例を示します。

 浮動小数形式では、「○○×△△の□□乗」というスタイルで小数を表します。このスタイルでは、同じ小数を様々な表現で表すことができます。例えば、3.14という数は、3.14×100、31.4×10-1、314.0×10-2、…などの様々な表現で表せます。これら3つの表現を見比べて分かるように、小数点の位置が変化できるから「浮動(固定でない)」というわけです。

●固定小数形式の2進数
コンピュータでは、浮動小数点形式の2進数で小数を取り扱っています。それに関しては、後で説明しますので、まずはお遊びとして(ドットが使えると して)固定小数形式の2進数について考えてみましょう。まず問題です。0.1という2進数は、10進数でいくつになるか分かりますか?

 答えは、0.5です。2進数では桁が上がると、重みが2倍されていきます。逆に考えれば、桁が下がると、重みが1/2倍になります。この重みと桁の数である1を掛けて、答えは0.5になります。

それでは次の問題です。0110.1101という2進数は、10進数でいくつになりますか?図3を見ながら考えてください。「重みを掛けて足す」という考え方は、整数でも小数でも、2進数でも10進数でも、同じです。
Photo

●浮動小数形式の2進数

コンピュータは、小数を浮動小数形式の2進数で取り扱っています。0と1だけを使って、「○○×△△の□□乗」というスタイルを表現するために、複数桁の2進数を部分的に分けて使います。どのように分けるかを規定しているのいがIEEEという組織です。「○○×△△の□□乗」の○○の部分を「仮数部(かすうぶ)」と呼びます。△△の部分を「基数部(きすうぶ)」と呼びます。□□の部分を「指数部」と呼びます。基数部は、2進数では2に決まっているので省略し、仮数部、指数部、そして0ならプラス1ならマイナスを意味する符号部を使って小数を表します。複雑なスタイルなので、浮動小数形式では全体を「反転して1」というマイナス表現は使われません。

 IEEEが規定する浮動小数形式には、64桁の2進数で小数を表す「倍精度浮動小数(ばいせいど・ふどうしょうすうてんすう)」と32桁の2進数で小数を表す「単精度浮動小数(たんせいど・ふどうしょうすうてんすう)」の2種類があります。桁数の多い倍精度浮動小数の方が、桁数の少ない単精度浮動小数より表現できる数の範囲が広くなります。
Photo_2

| | Comments (0) | TrackBack (0)

February 01, 2013

【応用情報】 基礎理論-補数2

数値表現(2)<負数の補数表現>

数値表現(1)で2進数の補数について説明した。

情報処理試験によく出るのは、2進数の補数を利用した「負数表現」である。
補数の意味さえしっかり理解しておけば簡単なので、今回は軽くポイントを。

2進数の負数表現には、以下の3つがある。
 (1) 符号と絶対値で表現する方法
 (2) 1の補数
 (3) 2の補数

全てに共通しているのは、最左ビットが符号だということ。

減算が加算回路だけで可能になるというメリットから、
補数表現が用いられる。

また、「2の補数」の方が「1の補数」よりも表現できる範囲が大きいため、
通常は2の補数が用いられる。
(書き出してみるとわかるが、2の補数は +0,-0 が無いから)

このことは、以下の解説がわかりやすいと思う。

 [徹底研究!情報処理試験(0041号)-2の補数-]
 http://mt-net.vis.ne.jp/ADFE_mail/0041.htm

なお、それぞれの値は以下のとおり。
 (1) 最左ビットで符号(0:+, 1:-)を表し、残りビットで通常の絶対値を表す
 (2) 負数表現では、上記(1)の符号ビット以外を反転した値
 (3) 負数表現では、上記(2)に1を加算した値

| | Comments (0) | TrackBack (0)

【応用情報】 基礎理論-補数1

数値表現(1)<補数>

【補数】
 補数とは、ある数が、ある基準となる数となるために加える数。
 ・・・って相変わらず言葉で書いても意味不明だな。
 入社当初はなんとなく暗記で済ませたものだ(^^;)

 数式で説明すると
  a + x = b
 で、xはaのbに対する補数と言う。
 10進数の例からあげてみると、4の10に対する補数は6ってこと。
 これもわかるようなわからないような微妙な表現。

 ここから本題。
 補数には以下の2つがある。
  (1) その桁で最大の数になる値
  (2) 次の桁に繰り上がるための値

 上記(1), (2)は、あるn進数において以下のように表現する。
  (1) n-1の補数
  (2) nの補数

 例えば、2桁の10進数では以下のようになる。
  (1)  9の補数:その数が 99になるための値
  (2) 10の補数:その数が100になるための値

 具体的に例をあげると、以下のようになる。
  (1) 2桁の10進数「33」の「 9の補数」は、 99 - 33 = 「66」
  (2) 2桁の10進数「33」の「10の補数」は、100 - 33 = 「67」

 さて、情報処理試験で出題されるのは2進数の補数である。
 2進数も同じ考え方でいける。
 例えば、
  (1) 4桁の2進数「1101」の「1の補数」は、 1111 - 1101 = 「0010」
  (2) 4桁の2進数「1101」の「2の補数」は、10000 - 1101 = 「0011」
 と表現できる。

 ここまで理解して、ようやく教科書的(一般的)な説明が理解できる。

 ●ある2進数の1の補数は、その数を反転した値である
  →全部の桁を1にすればいいから

 ●ある2進数の2の補数は、その数の1の補数に1を加えた値である
  →繰り上げて一つ桁をあげればいいから

 そもそもなんで1の補数、2の補数って2つあるのか?
 そんな疑問はようやく無くなりましたね。

 [参考:補数,シフト演算,浮動小数点数]
 http://software.nikkeibp.co.jp/software/special/mind/mind76.html

 [参考:2の補数]
 http://mt-net.vis.ne.jp/ADFE_mail/0147.htm

| | Comments (0) | TrackBack (0)

【応用情報】 基礎理論-基数

基数変換

【基数】
 「何進数か」を表す数値。
 例えば、日常では10進数なので基数は10である。

 [参考:基数とは]
 http://e-words.jp/w/E59FBAE695B0.html

【基数変換】
 ある値の基数を変換すること。
 例えば、10進数の16を16進数に基数変換すると、10になる。
 つまり、ある数値を別の基数で表せってこと。

【基数変換の方法】
 ・10進数→n進数
  整数部分は、nで除算し続けて剰余を逆に並べる。
  小数部分は、nを乗算し続けて整数を順に並べる。

  [参考:10進数をn進数に変換]
  http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/base.html

 ・n進数→10進数
  各桁の重みを足す。
  言葉で書くと難しいが、いくつか例を見ると簡単。

  例えば10進数の 123.45。
  これは、「各桁の重み」で表現すると以下のように表現できる。

   1×10^2 + 2×10^1 + 3×10^0 + 4×10^-1 + 5×10^-2

  ^はべき乗の意味。10^2なら10の2乗で100ってこと。
  ちなみに、-1乗とか-2乗は分母にすれば良い。
  10^-2なら10の2乗で割るって意味。

  で、上記の10の部分が基数。n進数を10進数に基数変換するには、
  上記式の10の部分がnになる。

  はしょって言うと、n進数を10進数に変換するには
  「各桁の数×基数^桁」を足していけば良い。

  [参考:基数変換]
  http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/kisuhenkan.htm

【TIPS】
 勉強の手助けとして、Windowsの電卓が使える。
 電卓の表示メニューで「関数電卓」を選択すると、
 電卓上で基数変換が可能。

 これによって、適当に数値を並べて自分で問題を作成し、
 基数変換する練習ができる。答え合わせは電卓でワンクリック。
 →でも、今確認した感じでは、16進小数に対応してないかも・・・

| | Comments (0) | TrackBack (0)

« November 2010 | Main | April 2013 »