Comments
Description
Transcript
基数変換
第2回 情報処理技術講義 コンピュータ計算の基本概念 ピ タ計算 基本概念 (記数表現と計算) 24 講義内容(Introduction) 第1回で説明したように,コンピュータは得意な繰り返し計算を 第 回 説明 う , タ 得 な繰り 計算を 行うことで様々な情報処理を実施している. その操作や考えを知ることは,情報処理の実施やコンピュ その操作や考えを知ることは 情報処理の実施やコンピュータ タ を活用していく上で必要不可欠である. そこで,本節ではコンピュータ計算の基本概念を以下の項目に そ 本節 は ピ タ計算 基本概念を以下 項目に 分けて説明を行う. ・記数表現と計算(復習) ・プログラムと論理 グラ と論理 ・論理を実現するハードウェア 25 記数法(numerical notation) 我々は数学を使うにあたって,10進法(decimal notation)を使用 [特殊例として60進数(Sexagesimal notation):分,秒など] しかし,コンピュータで10進法を扱おうとすると都合が悪い コンピュータは間違えてはならない 電気信号を多数分割すると不安定因子がいっぱい 立上り応答 コンピュータは計算が早くなくてはならない 四則演算ルールが複雑で計算が遅くなる シュートやノイズ (電気信号の不安定) コンピュータ計算では2進法(binary notation)を使用 [組織表現として16進法(hexadecimal notation)を使用する] 26 記数法(numerical notation) 2進法への変換(transform to binary notation) 10進数を2進数に変換 2 2 2 2 2 2 2 2 2 201 100 50 25 12 6 3 1 0 16進数への変換 0 1 2 3 : : : : 0000 0001 0010 0011 4 5 6 7 : : : : 2で割り,余りを下から並べる …1 …0 …0 …1 …0 0 …0 …1 …1 1 0100 0101 0110 0111 (Dec)201=(Bin) 11001001 2進数→10進数 2進数 10進数 (1*)27+(1*)26+(0*)25+(0*)24+(1*)23+(0*)22+(0*)22+(1*)20= 128+ 64+ 0+ 0+ 8+ 0+ 0+ 1= = (Dec)201 16→2進数は以下の通り.10進数変換は2進数を媒介する 8 9 A B : : : : 1000 1001 1010 1011 C D E F : : : : 1100 1101 1110 1111 (Hex)C9=(Bin) 11001001 0 1 2 3 : : : : 000 001 010 011 4 5 6 7 : : : : 100 101 110 111 8進数も同じ (Oct)27=(Bin) 010111 27 記数法(numerical notation) 10進数を2進数に変換すると,言葉で伝えにくい (Dec)128=(Bin) 10000000 「128だよ」 → 「いち ぜろ ぜろ ぜろ ぜろ ぜろ ぜろ ぜろ」 そこで… ケンシ ウ進法(K ケンシロウ進法(Kenshiro hi notation) t ti ) 10進法 0 1 2 3 4 2進法 0 1 10 11 100 ケンシロウ進法 た あ あた ああ あたた とすると, 128 = 10000000 = “あたたたたたたた” と,口頭伝達効率が2倍にUPする! , 頭伝達効率 倍 する http://www.haratetsuo.com/index.html (教育活用専用) ギャグですよ! 28 記数法(numerical notation) 大真面目な話… 情報は伝達する手段や伝える相手によって最適値が異なる 2進数は電気通信で送信するには都合が良いが,音声では大変 このように情報をどのような形で送れば,正確で効率が良いか 情報理論(後で学びます) バーコードから画像圧縮,暗号化まで応用ができます で うまく乗り越えられたかな? で,うまく乗り越えられたかな? しつこい! う~ん.間違いにくいという意味でもケンシロウ進数はすごいかも! 29 記数法(numerical notation) 2進法への変換(transform to binary notation) 10進数小数を2進数小数に変換 (1*)23+(0*)22+(0*)22+(1*)20と同様に, 2-1 2-2 2-3…とする 2-1 =0.5 2-2 =0.25 2-3=0.125 整数部は2で割ったので,小数部は2をかける 10進数 0.6875×2 0.375×2 0.750×2 0.500×2 小数のみ …整数部(1) …整数部(0) …整数部(1) …整数部(1) =1.375 =0.750 =1.500 =1.000 = 0.1011 0 0 小数部が0になるまで続ける (問)6.4375を2進数で示せ (Hint : 整数部と小数部は分けて考える) 30 記数法(numerical notation) ここまでのコンテンツについての補足 位取り記数法…数の表現を基準となる数(基数)の繰り返しで行うこと 基数変換…10進数→2進数のような変換のこと デ タ単位 以下の通り データ単位…以下の通り bit word…コンピュータにより様々だが,2byteを指す場合が多い 0 1 0,1 byte byte 固定小数点…最下位ビット右側もしくは最上位ビットの右側を小数点と する表現方法 小数点 小数点 浮動小数点…有効数字を一定に保つため,指数を導入した表現方法 72.56×10-5 仮数部 基数 指数 31 記数法(numerical notation) 2進法の演算(calculation with binary notation) 加算:論理和演算 (Dec)6=0110 +(Dec)3=0011 注意…最上桁上げ考慮の有無 1 1 1 0 0 1 =(Dec)9 減算:2の補数に変換して加算 (Dec)6=0110 ‐(Dec)3=0011 (Dec)3=0011 (Dec)3=1100 (D )3 1100 + 1 ‘ (Dec)3=1101 (Dec)6=0110 ‘ +(Dec)3=1101 ( ) 0011 =(Dec)3 反転させる (1の補数) 1を加える (2の補数) 最上桁上げ考慮無 最大桁を符号として使う方法 もある(各自確認せよ) ‐2(n‐1)~2(n‐1)‐1 8bitなら ‐128~127が表現できる 32 記数法(numerical notation) 2進法の演算(calculation with binary notation) 乗算:論理和演算 (Dec)3=0011 乗算は10進法と同じ ×(Dec)3=0011 0011 + 0011 1 1 1001 =(Dec)9 徐算:桁を合わせ、引ければ「1」を、引けなければ「0」をたてていく (Dec)10=1010 ÷(Dec)3=0011 0011 =(Dec)3 (Dec)3 あまり(Dec)1 あまり(Dec)1 0011 1010 ‐ 0011 0100 ‐ 0011 0001 0101 ‐0011 =0101+1101 =0010 (2の補数) 最上桁上げ考慮無 げ考 33 記数法(numerical notation) 2進法の演算(calculation with binary notation) ここで,乗算も除算も計算過程をみると,桁がずれているだけ (Dec)3=0011 0011 0011 1001 00 00 ×(Dec)3=0011 ×(Dec)3 0011 ‐ 0011 0011 0011 + 0011 ‐ 0011 1001 0 →論理シフトを使うと乗算や除算が楽にできる (Dec)2×(Dec)2 0010×0010 (Dec)2×(Dec)2=0010×0010 =0010×21 →0010を左に1ビットシフト →0100=(Dec)4 (Dec)2×(Dec)3=0010×0011 =0010×21+0010×20 →0010を左に1ビットシフト + 0010を左に0ビットシフト 0010を左に0ビ トシフト →0100+0010=0110=(Dec)6 (Dec)4÷(Dec)2=0100÷0010 =0100÷21 →0100を右に1ビットシフト →0010=(Dec)2 注意:除算自体,ビットシフトを利用している ので,楽になるのは2nで割るときのみ 34 記数法(numerical notation) 2進法の演算(calculation with binary notation) 少数の乗算も同様に行える (Dec)0.75=0.11 ×(Dec)0.75=0.11 ×(Dec)0.75 0.11 0.0011 + 0.011 0.1001 (Bin)0.1001=0.5+0.0625 = (Dec)0.5625 (Bin)0.11×(Bin)0.11 =0.11×2-1+0.11×2-2 →0.11を右に1ビットシフト + 0.11を右に2ビットシフト →0.011+0.0011=0.1001=(Dec)0.5625 0 011 0 0011 0 1001 (D )0 5625 少数の除算は整数までビットシフトすると楽 (Dec)0.1875÷(Dec)0.125 = (Bin)0.0011÷(Bin)0.001 両辺を5ビット左シフトして = (Bin)11÷(Bin)10 = (Bin)1.1 ( ) = (Dec)1.5 1.1 10 11 ‐ 10 1.0 ‐ 1.0 0 35 記数法(numerical notation) ここまでのコンテンツの補足 オーバーフロー…演算の結果,表現できる範囲を超えてしまうこと アンダーフロー…演算の結果,表現できる範囲より小さくなること けた落ち 演算の結果 有効数字が減少してしまうこと けた落ち…演算の結果,有効数字が減少してしまうこと 0.987654-0.987653 = 0.000001 情報落ち…非常に情報の少ない数値を演算すると,その情報が反映されない 987654+0.00001 = 987654 丸め誤差…四捨五入や切り捨てなどによって発生する誤差 IEEE単精度 the Institute of Electrical and Electronics Engineers inc IEEE単精度… inc. が制定した精度形式 非数…NaN(Not a Number) 文字コ ド…様々な言語に対応した変換コ ドのこと.以下のようなものがある 文字コード…様々な言語に対応した変換コードのこと.以下のようなものがある JISコード…Japan Industrial Standard cord シフトJISコード…Microsoft社策定で,文字の1バイト目で漢字か半角英数字を見分ける EUCコード…Extended UNIX code EBCDIC Extended Binary Coded Decimal Interchange Code EBCDIC…Extended UNICODE…全ての文字を2バイトで表現して各国語コードに対応させる 36 記数法演習(program practice) 講義ばかりでは面白くないので,計算機で実際に2進演算をやってみよう 今回使うソフトウ アは 今回使うソフトウェアは… MATLAB(Mathworks社) ・Cに似た制御構文 (if, while, for, switch...) ・インタプリタ型言語 ・弱い型付 弱い型付 ・行列計算に特化した構文規則 ・m-file単位でのプログラム管理 制御系の人はよく使っている.大学へ進学する人は覚えておくと得. 就職する人も近頃は研究や開発部門で使われ始めて る 就職する人も近頃は研究や開発部門で使われ始めている. 研究開発 ○ 最終目的物はプログラムそのものではない 仕様が曖昧、仕様がどんどん変わる 早く成果すなわち解析結果が出ればよい プロトタイプ開発 実製品 △ 最終目的物はプログラムそのもの 実行効率、低コスト、可搬性、品質保証 37 記数法演習(program practice) 動作方法,記述方法 ←ダブルクリック 新規作成 コマンドライン WorkSpace M_fileエディタ 38 記数法演習(program practice) 行列を想定したプログラミング (例)結果の非表示 >> A=1; >> (例)1行3列の行ベクトル変数C1 >> C1=[1 2 3] C1 = 1 2 3 (例)3行1列の列ベクトル変数C2 >> C2=[1;2;3] C2 = 1 2 3 (例)2行3列の実数行列変数D 例 行 列 実数行列変数 >> D=[11,12,13;14,15,16] D= 11 12 13 14 15 16 (例)2行3列のゼロ行列m1 >> m1=zeros(2,3) m1 = 0 0 0 0 0 0 (例)1行4列の一様分布する乱数ベクトルm2 >> m2=rand(1,4) m2 = 0.9501 0.2311 0.6068 0.4860 (例)1行10列の等間隔ベクトルm3 例 行 等 隔ベク 等間隔ベクトルはコロン:を使って、「初期値:増分値:最 終値」というフォーマットで定義します >> m3=1:3:30 m3 = 1 4 7 10 13 16 19 22 25 28 http://www.gsic.titech.ac.jp/~ccwww/tebiki/matlab/matlab5.html 39 記数法演習(program practice) いろんな機能 (例)画像の読み込み >>load clown >> clims = [10 60]; >> imagesc(X,clims) >> colormap(gray) (例)連立方程式の解法 >> A=[3,4;2,5]; >> b=[6;8]; >> x=inv(A)*b x= -0.2857 1.7143 (例)Sinカーブ、Cosカーブのプロット >> x=0:pi/8:2*pi; >> y1=sin(x);y2=cos(x); >> plot(x,y1,'g-o',x,y2,'r*') (例)音の再生 load handel; >>load >>sound(y,Fs); *ボリュームに注意して! >> load laughter; sound(y,Fs); >>sound(y,Fs); 40 記数法演習(program practice) C言語との主な違い 関数 命令 関数、命令 C言語 MATLAB 実行 コンパイル後実行 インタプリタ 配列 0から始まる。 配列は1から始まる。 for文1 for(j=0;j < NUM;j++) { } for(j=0;j < NUM;j=j+0.5) { } if (n==2) { a=1; b=2;; } switch (choice) { case 1: 文1 break; 文1; b k case 2: 文2; break; default: 文;break; } for j=0:NUM-1 end for j=0:0.5:NUM-1 end d if n==2 a=1; b=2;; end switch choice case 1 i 0 01 i x=-pi:0.01:pi; case2 plot(x, sin(x)); otherwise flug = 1; end for文2 if文 switch文 41 記数法演習(program practice) まあ,使ってみよう.まずは10進数→2進数変換から M_fileを新規作成して,書き込んでいく.Dec2bintest.mとして保存. 書きこんだ文章をすべてコピーして,コマンドラインウインドにペーストし,enter実行 2 2 2 2 2 2 2 2 2 201 100 50 25 12 6 3 1 0 …1 …0 …0 …1 …0 …0 …1 …1 2で割り,余りを下から並べる 2で割り,余りを下から並 る 42 記数法演習(program practice) 何度もコピー&ペーストするのは面倒くさいので… 先ほど作ったプログラムに関数宣言を加えて,関数化する. 保存して,コマンドウインドから以下のように呼び出すと,実行される. 43 記数法演習(program practice) 次に,2進数の加算 先ほどの関数を利用 桁上げ用配列を作っておく 最上桁は桁上げなし 計算結果が”2”の場合 計算結果が”3”の場合 計算結果(配列) 結果を10進数に変えて,確認 では,2進数の減算を自分で作ってみなさい 44