コンピュータ工学演習ノート - 名古屋大学taji/lecture/comp02/comp02...1...
TRANSCRIPT
1
コンピュータ工学演習ノート 田地@田村研
1.UNIX 1970頃 AT&T社の Bell研究所の研究員 K. Thompsonと D. Ritchieらにより開発された.その後,大学,研究所を中心に広く普及,発展した. (無償提供された,ソースコードが公開されている,改変が自由である....) 現在は,多くのワークステーション,パーソナルコンピュータの基本OSとなっている. BSD系(Berkley Software Distribution) FreeBSD,NetBSD など System V系 Solaris(Sun Microsystems)など Linux, 現在使用している端末は vine Linux で UNIX の仲間. 2.ターミナルの起動と終了(オンライン利用の手引きの kterm の項) [起動その1]画面の下の のアイコンをクリックする. [起動その2]画面左下の をクリックして システム → 日本語端末 へ [追加起動]上の起動方法1or2を繰り返す. または,すでに開いているターミナル上で,kterm & とコマンド入力する. [終了]exitとコマンド入力する. または Control-Dを入力する. 3.Shell(シェル) ターミナル(kterm, xterm)の一つ一つの画面は,それぞれがコンピュータの一つの端末に相当する. コンピュータに作業をさせるには,コマンドを入力することによって行う. Shellとは,コマンドを含む行を読み込み,解釈し,実行するプログラムであり,UNIXとユーザのインターフェイスとみなすことができる. Shellは簡単なプログラミング言語(インタプリタ)として動作する. UNIXを使う=Shellを実行する. ターミナルを起動すると,Shellプロセスが起動する. Shellの種類 ・bourne shell系:sh, bash, zsh,...... ・csh系:csh, tcsh,...... 現在使用している端末では bash が動いている.
2
(例)
プロンプトの出力
開始
コマンド行の読み込み
コマンド行の解析
終了
終了
yes
コマンドの実行no
Shellの処理の流れ図
Linux 2.0.31 (aurora1) (ttyp0)
aurora1 login: taji
Password:
Linux 2.0.31.
Last login: Thu Nov 11 13:34:28 on tty1.
No mail.
taji@aurora1% cal
November 1999
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
taji@aurora1%
login操作(ユーザ名とパスワードの入力)
コマンド入力(カレンダーを表示する)
その結果(今月のカレンダーを表示)
プロンプト
3
4.コマンド (書式)コマンド名 オプション 引数 [例]ls:ファイルの情報を表示するコマンド(list) オプションとしては,-a, -l, -t, -F .... などがある(通常ハイフン - を付ける) ls -al, ls -a -l のような書き方が可能(この2つは同じ意味) (実行例)
taji@aurora1% ls
Mail misc public_html thesis
RMAIL program texfile
taji@aurora1% ls -l
total 1087
drwxr-xr-x 6 taji user 512 Mar 12 1999 Mail
-rw-r--r-- 1 taji user 536084 Aug 27 11:28 RMAIL
drwxr-xr-x 2 taji user 512 Mar 30 1998 misc
drwxr--r-- 5 taji user 512 Nov 25 1998 program
drwxr-xr-x 3 taji user 512 Sep 29 11:36 public_html
drwxr--r-- 18 taji user 512 May 31 21:02 texfile
drwxr-xr-x 2 taji user 512 Sep 28 19:50 thesis
taji@aurora1% ls -al .logout
-rw-r--r-- 1 taji user 10 Apr 1 1998 .logout
taji@aurora1%
よく使うコマンド cat, cc, cd, chmod, cp, date, echo, find, grep, kill, less, more, man, mkdir, mv, ps, pwd, rm, rmdir, vi, which, who, ..... 5.ターミナルでのコンパイルの実行(C言語の場合) プログラム名は,abc.cのように .c(拡張子という)で終わるようにする. cc -o def abc.c と入力すると,abc.c をコンパイルし def という名の実行ファイルを作成する. (def と入力すると,プログラム abc.c が実行される.) -o defを省略すると,defの替わりに a.outという実行ファイルができる.
オプション指定した場合
引数の例
4
演習問題 【注意】この講義時間中の演習は,すべてターミナル上で行うこと.
1.よく使うコマンドのいくつかについて,そのコマンドの
用途,引数,オプション について調べなさい.また,実際にターミナル上で 引数を変えた場合 オプションを変えた場合
について実行して,結果を比較しなさい.さらに,それぞれ一つ例を挙げて,ターミナル上での実行結果を書きなさい.
2.gedit や netscape などのソフトウェアを,(アイコンをクリックするのではなく)タ
ーミナル上でのコマンド入力により起動させるにはどうすればよいか答えよ. 以上の2問を A4用紙1~2枚程度にまとめ,TAの確認をもらってシステム事務室に提出すること.〆切は 10月 11日(金)12時.
5
[前回] ターミナルの起動と終了,コマンド,ターミナル上でのコンパイルの実行. ターミナル上での作業→ウィンドウシステムに依存しない
• UNIXシステムであれば,どのコンピュータでも同じような作業ができる. • トラブルが起こったときに強い. • 慣れるまでは,扱いにくい.
[ファイル名に関する注意] ファイルやフォルダ名に使わない方がよい文字
• 半角カタカナ文字 • *!$( )/ ¥(バックスラッシュ);? ’ ”|<>{ }^& スペース などの記号(とくに*や?は絶対に使わないこと)
• 漢字やひらがなもあまりおすすめできない(互換性が乏しい) 6.バックグラウンドでのジョブの実行
UNIXはマルチタスク OSである. ↓ 複数のプロセスを同時に実行できる. その方法 ①複数のターミナルを立ち上げ,その中で実行する. ↓ 複数のウィンドウを開くので,メモリを消費する.
②バックグラウンドでのプロセスの実行 コマンド & または コマンドを入力した後 CTRL+ z bg と入力する.
どのようなプロセスが実行されているかは,ps コマンドで調べられる.また,バックグラウンドで実行しているプロセスを中止するには kill コマンドを用いる.
7.エディタ テキストやプログラムの作成・編集を行うにはエディタを用いる. [エディタの種類]
• ストリームエディタ:sed など. • ラインエディタ:行の概念を持ち,テキストの編集(テキストの表示や文字列の追
加・削除などの操作)を行単位で行うもの.ex, edなど. • キャラクタエディタ:行の概念を持たず,文字単位に編集を行うもの.
他の分類として, • スクリーンエディタ:画面全体を用い,画面中のカーソルを中心にした編集を行う
もの.vi など.
6
[viエディタ] ex,edを拡張したスクリーンエディタ.10年位前までは UNIX上の最も標準的なエディタ.
vi ファイル名 で起動する.
編集作業を終了し,バッファファイルをファイルに書き込み vi を終了するにはコマンドモードで ZZ を入力する. viの主なコマンド h j k l カーソルの移動 ^U ^D スクロールアップとスクロールダウン /textRET 文字列(この例では text)の検索 a カーソルの右側にテキストの追加 A カーソル行の終わりにテキストの追加 itextESC カーソルの左に textを挿入 x カーソル上の文字を削除 dw 単語の削除 dd カーソル行の削除 3dd 3 行削除 rc カーソル上の文字を cに変える R カーソルから先を上書きして変更 u 直前のコマンドによる変更を取り消す :!コマンド 指定したコマンドを実行 :shell シェルを起動.シェルを終わると vi に戻る :w バッファの内容をもとのファイルに書き込む :w ファイル名 バッファの内容を指定したファイルに書き込む :q! 強制終了(すべての編集を取り消して終了)
コマンドモード
テキスト入力モード
exモード
サブコマンド(a,iなど)ESCRET
「:」
7
その他のコマンドや,exモード,正規表現については各自で調べること. [emacs環境]
emacs はもともとキャラクタエディタをベースとしたスクリーンエディタとして開発された.さまざまなカスタマイズ機能(キーバインディングの変更,キーボードマクロの定義,Lisp による自由な関数の作成など)を持つ.このため,単なるテキストエディタだけでなく,メールやニュースの読み書き,プログラミング開発環境といった,一つの環境として働く.GNU emacs,nemacs,mule,xemacs など.
emacs (ファイル名)または mule (ファイル名) で起動し,C-x C-c で終了する. メディアセンターの環境で,ターミナル上で起動するには -nw オプションをつけ
xemacs -nw(ファイル名) とする.
emacsの主なコマンド C-f C-b C-n C-p カーソルの移動 C-v M-v スクロールアップとスクロールダウン C-s (C-r) 与えられた文字列パターンを前方(後方)へ検索 C-d カーソル上の文字を削除 M-d 単語の削除 C-k カーソルから行の終わりまでを削除 C-x u 一つ分の変更を取り消す M-x shell RET *Shell*というバッファを使ってシェルを起動. C-x C-f 新しくバッファを作成し,指定したファイルをそこに読み込む C-x C-s バッファの内容をもとのファイルに書き込む C-x C-w バッファの内容を指定したファイルに書き込む その他のコマンドや,Lisp関数などについては各自で調べること. emacs 上での日本語のオン/オフは C-¥(C-バックスラッシュ)で行う. ***TAの方へ***
viや emacsについて,補足してあげて下さい.
8
演習問題 3.いろいろなコマンドを実行する際,フォアグラウンドで実行した場合と,バックグラウンドで実行した場合に,どのような違いが見られたか,書きなさい.
4.以下の二つのプログラムを,viや emacsを用いて作成・編集しなさい.ただし,emacs
では,マウスを用いないこと.また,普段使っているエディタと比較して,どのように感じたか(操作性や,機能の点など),感想を A4用紙1枚程度にまとめよ.
a) 標準入力(キーボード)からテキストデータ(例えば,アルファベットと数字からなるふつうの英文のようなもの)を読み込み,その中の単語を切り出してファイルに出力するプログラムを作成しなさい.ただし一行に一つの単語を出力するものとし,大文字はすべて小文字に変換すること.(単語とは,スペース,コンマ,ピリオドなどによって一区切りにされている文字列のこと.getchar とか,putchar とかをつかうときれいにかける.)
b) 標準入力(キーボード)からテキストデータを読み込み,その中に連続して同じ行があれば,重複する行を削除して出力するプログラム(UNIXの uniqコマンドにあたるもの).
以上の二問を,レポートとしてシステム事務室へ提出しなさい.〆切は,10月18日(金)12時.
9
8.ファイル構造 UNIX に限らずほとんどの OS(DOS,WINDOWS 系,MacOS など)ではファイル構造は「木構造」になっている.木とは,ノード(節点)とリンク(枝)からなる上下関係を持った階層構造. UNIXのファイルシステムでは,ノードは ファイル,ディレクトリ,リンク(シンボリックリンク)
の3通り.
[特殊なディレクトリ名] . カレントディレクトリ(pwdで確認できる) .. 一つ上のディレクトリ / ルートディレクトリ ~username usernameのホームディレクトリ
[パス名] ルートからファイルのある場所を指定する経路. / で区切って表す. (例) /usr/bin/jlatex 絶対パス:ルートからすべて記述するもの /usr/usrhome/hatono/abc.c 相対パス:カレントディレクトリから指定するもの ../hatono/abc.c
[ディレクトリの操作]
pwd カレントディレクトリのパス名を表示 cd ホームディレクトリへ移動 cd aaa aaaというディレクトリへ(そのディレクトリにもしあれば)移動 cd .. 一つ上のディレクトリへ移動 ls ディレクトリの中身を表示 mkdir aaa aaaというディレクトリを作成 rmdir aaa aaaというディレクトリを削除
[補足]
UNIX 上の資源(キーボード,CRT,メモリ,通信路....)はすべてファイルとして取り扱うことができるように設計されている. 正規表現.
bin dev etc lib usr tmp
bin sbin spool man usrhome local
/ ルートディレクトリ
include
jlatex a2ps netscape
taji hatono
taji abc.c xyz.c abc.c
10
9.ファイルの属性 • ファイル名,作成/更新日時,ファイルの大きさ • 所有者(ユーザ名),所有者の属するグループ • 保護モード:所有者,所有者の属するグループ,その他のユーザのそれぞれに対して,読み,書き,実行可能,Setuid オプションの指定をする.
これらは lsコマンドで確認できる [例]
属性の変更 chmod chmod 対象(u,g,o)+/-[r/w/x] ファイル名
[例] taji@aurora2% ls -al freas
-rwxr--r-- 1 taji user 5648 Feb 21 1996 freas
taji@aurora2% chmod o+x freas
taji@aurora2% ls -al freas
-rwxr--r-x 1 taji user 5648 Feb 21 1996 freas
taji@aurora2% chmod g-r freas
taji@aurora2% ls -al freas
-rwx---r-x 1 taji user 5648 Feb 21 1996 freas
taji@aurora2% chmod 744 freas
taji@aurora2% ls -al freas
-rwxr--r-- 1 taji user 5648 Feb 21 1996 freas
10.リダイレクト,パイプ [リダイレクト] コマンドの標準入出力・標準エラー出力をファイルに切り替えること コマンド < ファイル ファイルから入力 コマンド > ファイル ファイルへ出力 コマンド >> ファイル ファイルへ追加 コマンド >& ファイル 出力とエラーをファイルへ
[例] ls > aaa.list
ls -al >> aaa.list
sort < abc.c
taji@aurora2% ls -al .d*
-rw-r--r-- 1 taji user 9 Apr 2 1998 .dir_colors
-rwxr-xr-- 1 taji user 5111 Nov 13 19:03 .dtprofile
他のユーザ(others)に読む(read)のを許可 所有者と同じグループ(group)のユーザに対し読むと実行(execute)を許可 所有者(user)は,読み書き実行すべて可
所有者 グループ名
大きさ更新日時
ファイル名
11
[パイプ] コマンド1 | コマンド2 コマンド1の標準出力をコマンド2の標準入力に流し込む [例]
ls -al ¦ wc -l
ls -al ¦ grep 'test*.c'
リダイレクト,パイプを組み合わせることにより,高度な機能を持つ複雑なコマンドを作ることができる. 演習問題 5. 現在使っているコンピュータのファイル構造について調べなさい.コマンドや,アプリケーションがどこにあるか?
6. コマンドやアプリケーション,また,自分で作成したファイルやディレクトリの属性や,所有者などがどうなっているか調べなさい.
7. 演習問題4 a), b) で作成したプログラムと sortコマンドを用いると,テキストに含まれる単語を一行に一つずつ,重複することなしに,アルファベット順に出力するコマンドを作成することができる.それにはどうすればよいか.方法を示せ.
8. 小さなテキストファイル(例えば,.logout のような2~3行の環境設定用ファイルなど)は,エディタを使わなくても作成することができる.その方法と実行例を示しなさい.
レポートその1 以上の4問を A4 用紙1~2枚程度にまとめ,システム事務室に提出しなさい.〆切は 10月25日(金)16時. レポートその2 演習問題4 a), b) のソースリストをシステム事務室に提出しなさい.ただし,TAに動作確認してもらうこと.〆切は,11月6日(水)12時.
12
11.分割コンパイル プログラムを作成する際に,ソースコードを複数のファイルに分割して作成する方法.プログラムが,sample.c, sub1.c, sub2.c から構成されているものとする. [コンパイルの方法]
cc -c sample.c
cc -c sub1.c
cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o
ソース-(コンパイル)→アセンブラコード-(アセンブル)→オブジェクトコード cc -c
オブジェクトコード1 オブジェクトコード2 -(リンク)→実行ファイル オブジェクトコード3
[利点]
1.開発時のコンパイル時間の短縮 2.汎用的関数やサブルーチンの再利用が可能 3.関数(名),変数(名)の通用範囲(スコープ)の制限が可能
[どのようなときに使うか]
1.多人数でのプログラム開発(OSなど) 2.大規模なプログラム開発 (例)プログラムのあるサブルーチンをいろいろ取り替えて実行してみたい. 一つの処理をいろいろなプログラムの中で利用したい. (オブジェクトコードを一度作っておけばリンクするだけでよい)
[ヘッダファイルと再コンパイルのお話] 分割してソースファイルを作成する場合,同じ
配列,関数,パラメータ...... がいくつかのファイルで用いられることが多い.このとき
関数や配列のプロトタイプ宣言 パラメータの宣言(定義) などを,それぞれのソースファイルの先頭で行わなければならない. しかし,同じ文をそれぞれのソースファイルに書くのは無駄が多い.また,その部分を修正したい時には,全てのファイルで修正しなければならない(ミスを発生しやすい).そこで,それらをヘッダファイルに置き,必要に応じて include すると便利.
[ヘッダファイルに何を書くか] ・関数,配列のプロトタイプ宣言 ・define 文 ・大域変数(使い方による)
×プログラム本体は書かない
13
(例) config.h
sample.c sub1.c
12.変数の通用範囲(スコープ) [プログラムがひとつのファイルからなる場合]
a) { } の中で宣言された変数(自動変数) { } の中でのみ領域が確保される
void main(void){
int a;
}
void sub1(void){
int a;
}
{ } の外でも領域を確保するには staticを付けて宣言する.
static int a;
b) 関数( { } )の外で宣言された変数(大域変数)
ファイル全域で領域が確保される.ただし自動変数と重なった場合は自動変数が優先される. ひとつのファイルからなる場合 staticを付けても動作に変化はない. { } の中で externを付けて宣言すると大域変数を参照する.
[2つ以上のファイルからなる場合]
a) 自動変数については1ファイルの場合と同じ b) 他のファイルにある大域変数を参照するには externを付けて宣言する. extern int a;
大域変数に staticを付けて宣言すると他のファイルから参照できなくなる. staticを関数宣言に付けると他のファイルからその関数を呼べなくなる(名前が重なってもよい).
#define MAX 0
void push(double)
#include <stdio.h>
#include "config.h"
main( ){
/* メインプログラム */
}
#include <stdio.h>
#include "config.h"
sub1( ){
/* サブルーチンのプログラム */
}
この2つの aは無関係
14
演習問題 9. 下のプログラム例の《 (ア) 》の行を
①int a; ② extern int a; ③ 何も書かない として実行し,それらの結果を比較せよ.また,メインプログラムの int a; に static をつけるとどうなるか?一つのプログラムで作成した場合と,2つに分割して作成した場合で比較せよ. #include <stdio.h>
int a;
void sub1(void);
void main(void){
a=0;
printf("%d¥n",a);
a=2;
printf("%d¥n",a);
sub1();
printf("%d¥n",a);
}
10. a)一実変数の方程式 0)( =xf に対する二分法は, 0)(,0)( <> bfaf であるような2点 ba, を選び, ba ≈ となるまで,以下の手続きをくり返す.
2/)( bac += if 0)( >cf then ca =
else if 0)( <cf then cb = このプログラムを作成せよ.ただし,メインルーチンと関数 f を計算する部分を別のファイルに作成すること. b)1実変数関数 0)( =xf の根を求めるのに,Newton 法(Newton-Raphson 法)を適用すると,その反復は,適当な初期点 0x からはじめて
を繰り返し行う.これを前問と同様に,メインルーチン, f および f ′を計算する部分にわけて作成せよ. c)二分法と,ニュートン法を用いて,例えば, 0cos =− xx や3次方程式の解を求めよ.また,二つの方法の比較をおこないなさい.
演習問題 9について,A4用紙1枚以内にまとめ,前回のレポートその2とあわせてシステム事務室に提出しなさい.〆切は11月6日(水)12時.
#include <stdio.h>
void sub1(void){
《 (ア) 》 a=100;
}
)()(
1k
kkk xf
xfxx
′−=+ ,....)2,1,0( =k
15
[分割コンパイルの復習] cc -c sample.c (sample.oというオブジェクトファイルを生成) cc -c sub1.c (sub1.o というオブジェクトファイルを生成) cc -c sub2.c (sub2.o というオブジェクトファイルを生成) cc -o sample sample.o sub1.o sub2.o (sample.o sub1.o sub2.oの 3つをリンク
して sampleという実行ファイルを生成) 上の 4行は cc -o sample sample.c sub1.c sub2.c
と同じ. ヘッダファイルを修正したときには,
それを include しているファイルすべてを再コンパイルする必要がある. ↓
覚えるのは大変 ↓
make の利用 13.Make
Makefileまたは makefileというファイルに分割コンパイル時のファイルの依存関係と処理方法を記述. ↓ 部分的な変更があった場合,変更が及ぶ範囲だけを処理する. ファイル include しているヘッダ sample.c ← config.h inc1.h inc2.h sub1.c ← config.h inc1.h sub2.c ← config.h inc2.h makefile の例 ---------<ここから>--------- #
# 簡単な makefile の例
#
all: sample
sample: sample.o sub1.o sub2.o
cc -o sample sample.o sub1.o sub2.o
sample.o: sample.c config.h inc1.h inc2.h
cc -c sample.c
sub1.o: sub1.c config.h inc1.h
cc -c sub1.c
sub2.o: sub2.c config.h inc2.h
cc -c sub2.c
---------<ここまで>------------
トップレベルのターゲット
16
[書式] 作りたいファイル:必要なファイル と 依存関係 (TAB)ファイルを作るのに必要なコマンド
上の makefileを sample.c sub1.c sub2.c config.h inc1.h inc2.hと同じディレクトリにおき, make
と入力すると cc -c sample.c
cc -c sub1.c
cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o
が実行される. このあと
a) sample.cだけを変更したとき,makeと入力すると cc -c sample.c
cc -o sample sample.o sub1.o sub2.o
b) sub1.cだけを変更したとき cc -c sub1.c
cc -o sample sample.o sub1.o sub2.o
c) inc2.hだけを変更したとき cc -c sample.c
cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o
d) config.hだけを変更したとき cc -c sample.c
cc -c sub1.c
cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o
がそれぞれ実行される. [補足と参考]
• sub1.oだけを生成したいときは make sub1.o
と入力すればよい. • 上の makefileを sample.makeというファイル名で作成したときは make -f sample.make
と入力すればよい. • makefileの中では変数が使用可能.
17
(例) OBJ = sample.o sub1.o sub2.o
INC = config.h inc1.h inc2.h
LIB = -lm
sample: $(OBJ)
cc -o sample $(OBJ) $(LIB)
sample.o: sample.c $(INC)
cc -c sample.c
sub1.o: sub1.c config.h inc1.h
cc -c sub1.c
sub2.o: sub2.c config.h inc2.h
cc -c sub2.c
makeのより高度な利用法については各自で調べて下さい.
演習問題 11. 演習問題 10 a)b)をコンパイルするためのmake ファイルの例を示せ. 12. 演習問題 10 a)b)で作成した二分法とニュートン法のプログラムを,多項式用に修正せよ.すなわち,関数を直接プログラムに書くのではなく,次数と係数(および初期点)を入力すればよい形に改めよ.(例えば, 245)( 23 +−+= xxxxf で,初期点を0とするのであれば, 0,2,4,1,5,3 − のように入力する.)また,それを用いて,適当な多項式(少なくとも4次以上で,自明ではない解であること)の解を求めなさい.
演習問題 10~12の解答(ソースファイルおよび実行結果)を,11月 11日(月)午後4時までにシステム事務室へ提出しなさい.
(cc -o sample sample.o sub1.o sub2.o –lmと同じ)
18
14.計算機内部での数の表現(たぶん復習) a) 整数および自然数 ①符号+絶対値表現
左端の1ビットを符号,残りを2進数で表された絶対値とする方法.例えば1バイトで 13と-13を表すと,以下のようになる. [10進数] [2進数] 13 00001101 -13 10001101
②1の補数表現 絶対値を2進数で表現する.ただし,その数が負の場合は,ビットの 0 と 1 を反転したものが表現となる. [10進数] [2進数] 13 00001101 -13 11110010
③2の補数表現 絶対値を2進数で表現する.ただし,その数が負の場合は,ビットの 0 と 1 を反転し,1を加えたものが,表現となる. [10進数] [2進数] 13 00001101 -13 11110011
④n増し表現 これについては各自調べよ.例えば,127増し表現では以下のようになる. [10進数] [2進数] 13 10001100 -13 01110010
ほとんどの計算機では,2の補数表現が用いられている.
b) 実数 浮動小数点表現
で表される.Mを仮数,bを基数,Eを指数という.同じ数を表す浮動小数点表現はたくさんある.そこで,仮数の最上位が 0でないものを用い,その左隣に小数点を置いた表現を,正規化された浮動小数点表現と呼ぶ.正規化された浮動小数点表現では,仮数の最上位ビットは必ず 1であるため,この 1は省略される.また,指数の部分は127増し(64ビットの場合は 1023増し)表現の整数が用いられる. 標準規格 IEEE754-1985 単精度 4バイト(指数 8ビット,仮数 23ビット)10進約 7桁の有効数字 倍精度 8バイト(指数 11ビット,仮数 52ビット) 16桁
32ビット表現 符号 指数 仮数
1bit 8bit 23bit
64ビット表現 符号 指数 仮数
1bit 11bit 52bit
( ) Es bM ××−1
19
( ) 01 ×− s
( ) ∞×− s1
なお,指数部,仮数部のすべてのビットが 0のとき,
指数部のビットがすべて 1,仮数部のビットがすべて 0のとき,
指数部のビットがすべて 1,仮数部が 0でないときは数値でない,と決められている. IEEE754 では,指数部が最小になったとき,仮数部の最初の桁に 0 を許す(非正規化). 最小 3241074 10940.42 −− ×= L これ以下ではアンダーフロー CPU内部では,拡張倍精度(規格外)が用いられている. Pentiumなどでは,仮数部 64ビット(全部で 80ビット)
SPARCでは全部で 128ビット
c) 桁あふれ 整数,実数ともに,決められたビット数で表現できる値には範囲がある.したがって,演算を行うことにより結果がその範囲に収まらないことがおきる.これを,桁あふれoverflowという.逆に,浮動小数点の場合,値の絶対値が小さすぎて表現できない場合がある.これをとくに underflowと呼ぶ.
15.数値誤差
0.1(10進)= 0.000110001100011.....(2進) if(a==0.1) とすると止まらないかもしれない.
[計算機の誤差の種類] ① データ誤差(入力誤差)
円周率, 2など無限小数を有限小数で表したときの誤差や,2進 10進の変換による誤差(0.1).
② 打ち切り誤差 本来は,無限級数を有限項までで打ち切った場合の誤差であるが,反復計算を有限回で止めたときや,積分の有限和での近似などの意味で言う.理論的な解析ができる.
③ 丸め誤差 実数を有限桁で計算することによる誤差.
IEEE754では,四則演算と平方根について
実数上での演算を丸めた結果=浮動小数点での演算結果 上の3つは比較的問題ない. 問題は以下の二つ,およびそれらが重なって起こる場合.
a) 情報落ち(積み残し) 絶対値の小さい値を大きい値に加えても変化が起きない現象.
b) 桁落ち 近い値の 2つの数を引き算したときに起こる現象. 1.732840-1.732159=0.000681 有効数字が減る→相対誤差が大きくなる.
20
演習問題 13. 5ビットで表現できる整数のすべてを,符号+絶対値表現,1の補数表現,2の補数表現,15増し表現の四つの方法で表現した一覧表を作成せよ.多くの計算機で 2の補数表現が用いられている理由は何か?
14. 正規化倍精度で表現できる,絶対値最大および最小の数はいくらか,しらべよ. 15. (ガウスの消去法の後半部分)上三角行列の線形方程式(対角成分は非零とする)
=
nnnn
n
n
b
bb
x
xx
a
aaaaa
MM
L
MOOM
L
L
2
1
2
1
222
11211
00
0
の解を求めるプログラムを作成しなさい.また,それを用いて,
−=
12
35
400073009620
10851
4
3
2
1
xxxx
の解を求めよ. 演習問題 13, 14の解答を,11月 15日(金)午後4時までにシステム事務室へ提出しなさい.
21
本日は演習問題のみです. 演習問題 16. 演習問題 15の前段階として,以下の手順を付け加えて線形方程式
=
nnnnn
n
n
b
bb
x
xx
aa
aaaaaa
MM
LL
MOMM
L
L
2
1
2
1
1
22221
11211
を解くガウスの消去法のプログラムを完成させよ. 手順
1,,2,1 −= nk L nkki ,,2,1 L++=
nkkj ,,2,1 L++=
kjkkikijij aaaaa ×−= )/(
kkkikii baabb ×−= )/(
なお, 0=kka のときには, ),,2,1( nkkja jk L++= の中で,絶対値最大のものがあ
る行と,第 k行をすべて入れ替える. つぎに,これを利用して以下の手順で問題を作成し解を求めよ. ① http://www-tamlab.sys.es.osaka-u.ac.jp/~taji/lecture/lecture.html にある「問題生成プログラム」をダウンロードする.
② プログラムを実行し,指示に従い学籍コードを入力すると,次ページで説明するような問題のファイルができる.
③ その問題の解を求めよ.(万が一解が求められなかった場合は,②で学籍コードを入力する替わりに,適当な3桁の数を入力せよ.またその場合,レポートに,入力した数を記しておくこと)
17. 二分法やニュートン法以外にも,多項式の根を求める方法がいくつかある.それらを調べ,A4,1ページ程度にまとめなさい.
18. 講義内容や,配布したプリントなどに誤りがあれば,指摘して下さい. 以上3問を,レポートとして提出すること. 締 切:12月20日(金)12時(期限厳守) 提出先:システム事務室 なお,問題 16については,解答が間違っていた場合,再提出を命じます.
22
問題 16のファイルデータの説明 問題生成プログラムは,以下のようなテキストファイルを生成します. まず1行目に行列の次元(方程式の数)が書かれています.2行目から, 111 −−− の行までは行列 Aの要素であり,それぞれの行は ijaji を表しています.そのあとに,
右辺のベクトルbの要素が続き,各行は ibi となっています.最終行の 11 −− はデータのおわりを示しています.また,行列 Aの部分については,要素の値が 0 であるところは,省略します. 例えば,
−=
−−
401
140522301
x
という問題例の場合,データは, 3 1 1 1 1 3 3 2 1 -2 2 2 2 2 3 5 3 2 4 3 3 -1 -1 -1 -1 1 1 2 0 3 -4 -1 -1 となります.
行列要素のおわりを示す
行列 Aの要素データ
ベクトルbのデータ
3行3列である
データの終わりを示す
演習問題4a)の解答例
#include<stdio.h>
#include<ctype.h>
void main(void){
int c;
while((c=getchar())!=EOF){
if(isspace(c)!=0){ /* 空白,タブ,改行文字なら0,そうでないとき非0 */ c='¥n';
}
c=tolower(c); /* 大文字を小文字に変換 */ putchar(c);
}
}
演習問題4b)の解答例
#include <stdio.h>
#include <ctype.h>
void main()
{
char s[100],prev[100]; /* 1行は 100文字以内とする */ strcpy(prev,""); /* 空文字列を prev へコピー */ while(scanf("%s",s)!=EOF){ /* ファイルの終端が来るまでループ */ if(strcmp(s,prev)!=0){ /* s と prev を比較,同じならば0 */ printf("%s¥n",s);
strcpy(prev,s); /* s を prev へコピー */ }
}
}
演習問題 14の解答 絶対値最大: ( ) 308102352 10797.1222 ×=×− − L 絶対値最小: 3081023 10225.22 −− ×= L