• 検索結果がありません。

コンピュータ工学演習ノート 田地@田村研

N/A
N/A
Protected

Academic year: 2021

シェア "コンピュータ工学演習ノート 田地@田村研"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

コンピュータ工学演習ノート

田地@田村研 1.UNIX

1970AT&T社のBell研究所の研究員K. ThompsonD. 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の確認をもらってシステム事務室に提出 すること.〆切は1011日(金)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の主なコマンド

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など) RET ESC

「:」

(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の方へ***

viemacsについて,補足してあげて下さい.

(8)

演習問題

3.いろいろなコマンドを実行する際,フォアグラウンドで実行した場合と,バックグラ ウンドで実行した場合に,どのような違いが見られたか,書きなさい.

4.以下の二つのプログラムを,viemacsを用いて作成・編集しなさい.ただし,emacs では,マウスを用いないこと.また,普段使っているエディタと比較して,どのよう に感じたか(操作性や,機能の点など),感想をA4用紙1枚程度にまとめよ.

a) 標準入力(キーボード)からテキストデータ(例えば,アルファベットと数字から なるふつうの英文のようなもの)を読み込み,その中の単語を切り出してファイ ルに出力するプログラムを作成しなさい.ただし一行に一つの単語を出力するも のとし,大文字はすべて小文字に変換すること.(単語とは,スペース,コンマ,

ピリオドなどによって一区切りにされている文字列のこと.getchar とか,

putchar とかをつかうときれいにかける.

b) 標準入力(キーボード)からテキストデータを読み込み,その中に連続して同じ行 があれば,重複する行を削除して出力するプログラム(UNIXuniqコマンドに あたるもの)

以上の二問を,レポートとしてシステム事務室へ提出しなさい.〆切は,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 abc.c xyz.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)一実変数の方程式 f(x)=0に対する二分法は, f(a)>0, f(b)<0であるような 2点a,bを選び,a bとなるまで,以下の手続きをくり返す.

2 / ) (a b c= +

if f(c)>0 then a=c else if f(c)<0 then b=c

このプログラムを作成せよ.ただし,メインルーチンと関数 f を計算する部分を別の ファイルに作成すること.

b)1実変数関数 f(x)=0の根を求めるのに,Newton 法(Newton-Raphson 法)を 適用すると,その反復は,適当な初期点x0からはじめて

を繰り返し行う.これを前問と同様に,メインルーチン, f および fを計算する部分 にわけて作成せよ.

c)二分法と,ニュートン法を用いて,例えば,cosxx=0や3次方程式の解を求め

よ.また,二つの方法の比較をおこないなさい.

演習問題9について,A4用紙1枚以内にまとめ,前回のレポートその2とあわせてシステ ム事務室に提出しなさい.〆切は11月6日(水)12時.

#include <stdio.h> 

 

void sub1(void){ 

《  (ア)  》      a=100; 

) (

) (

1

k k k

k f x

x x f

x + = (k =0,1,2,....)

(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.o3つをリンク

して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)ファイルを作るのに必要なコマンド

上のmakefilesample.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  と入力すればよい.

• 上のmakefilesample.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)で作成した二分法とニュートン法のプログラムを,多項式用に修正

せよ.すなわち,関数を直接プログラムに書くのではなく,次数と係数(および初期 点)を入力すればよい形に改めよ.(例えば,f(x)=5x3 +x2 4x+2で,初期点を0 とするのであれば,3,5,1,4,2,0のように入力する.)また,それを用いて,適当な 多項式(少なくとも4次以上で,自明ではない解であること)の解を求めなさい.

演習問題10〜12の解答(ソースファイルおよび実行結果)を,1111日(月)午後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

( )

−1 s ×M ×bE

(19)

( )1s×0 ( )1s ×

なお,指数部,仮数部のすべてのビットが0のとき,

指数部のビットがすべて1,仮数部のビットがすべて0のとき,

指数部のビットがすべて1,仮数部が0でないときは数値でない,と決められている.

IEEE754 では,指数部が最小になったとき,仮数部の最初の桁に 0 を許す(非正規

化)

  最小 21074 =4.940L×10324 これ以下ではアンダーフロー CPU内部では,拡張倍精度(規格外)が用いられている.

  Pentiumなどでは,仮数部64ビット(全部で80ビット)

SPARCでは全部で128ビット

 

c) 桁あふれ

整数,実数ともに,決められたビット数で表現できる値には範囲がある.したがって,

演算を行うことにより結果がその範囲に収まらないことがおきる.これを,桁あふれ

overflowという.逆に,浮動小数点の場合,値の絶対値が小さすぎて表現できない場

合がある.これをとくにunderflowと呼ぶ.

15.数値誤差

0.1(10進)= 0.000110001100011...(2進)

if(a==0.1) とすると止まらないかもしれない.

[計算機の誤差の種類]

①  データ誤差(入力誤差)

円周率, 2など無限小数を有限小数で表したときの誤差や,210進の変換による 誤差(0.1)

②  打ち切り誤差

本来は,無限級数を有限項までで打ち切った場合の誤差であるが,反復計算を有限回 で止めたときや,積分の有限和での近似などの意味で言う.理論的な解析ができる.

③  丸め誤差

実数を有限桁で計算することによる誤差.

  IEEE754では,四則演算と平方根について

実数上での演算を丸めた結果=浮動小数点での演算結果

上の3つは比較的問題ない.

問題は以下の二つ,およびそれらが重なって起こる場合.

a) 情報落ち(積み残し)

絶対値の小さい値を大きい値に加えても変化が起きない現象.

b) 桁落ち

近い値の2つの数を引き算したときに起こる現象.

1.732840−1.732159=0.000681 有効数字が減る→相対誤差が大きくなる.

(20)

演習問題

13. 5ビットで表現できる整数のすべてを,符号+絶対値表現,1の補数表現,2の補数表 現,15増し表現の四つの方法で表現した一覧表を作成せよ.多くの計算機で2の補数 表現が用いられている理由は何か?

14. 正規化倍精度で表現できる,絶対値最大および最小の数はいくらか,しらべよ.

15. (ガウスの消去法の後半部分)上三角行列の線形方程式(対角成分は非零とする)





=









n n

nn n n

b b b

x x x

a a a

a a

a

M M

L

M O O M

L L

2 1 2

1 2 22

1 12

11

0 0

0

の解を求めるプログラムを作成しなさい.また,それを用いて,





=









1 2 3 5

4 0 0 0

7 3 0 0

9 6 2 0

10 8 5 1

4 3 2 1

x x x x

の解を求めよ.

演習問題13, 14の解答を,1115日(金)午後4時までにシステム事務室へ提出しなさ

い.

(21)

本日は演習問題のみです.

演習問題

16. 演習問題15の前段階として,以下の手順を付け加えて線形方程式





=









n n

nn n

n n

b b b

x x x

a a

a a

a

a a

a

M M

L L

M O M M

L L

2 1 2

1

1

2 22

21

1 12

11

を解くガウスの消去法のプログラムを完成させよ.

手順

1 , , 2 ,

1

= n

k L

n k

k

i= +1, +2,L, n k

k

j = +1, +2,L,

kj kk ik ij

ij a a a a

a = ( / )×

k kk ik i

i b a a b

b = ( / )×

なお,akk =0のときには,ajk (j=k+1,k+2,L,n)の中で,絶対値最大のものがあ る行と,第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行目から,1 1 1 行までは行列Aの要素であり,それぞれの行は i j aij を表しています.そのあとに,

右辺のベクトルbの要素が続き,各行は i bi となっています.最終行の 1 1 はデ ータのおわりを示しています.また,行列Aの部分については,要素の値が 0 であるとこ ろは,省略します.

例えば,

=

4 0 1

1 4 0

5 2 2

3 0 1

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列である

データの終わりを示す

(23)

演習問題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の解答

絶対値最大:

(

2252

)

×21023 =1.797L×10308

絶対値最小:21023 =2.225L×10308

参照

関連したドキュメント

シートの入力方法について シート内の【入力例】に基づいて以下の項目について、入力してください。 ・住宅の名称 ・住宅の所在地

のようにすべきだと考えていますか。 やっと開通します。長野、太田地区方面  

ビッグデータや人工知能(Artificial

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.

■使い方 以下の5つのパターンから、自施設で届け出る症例に適したものについて、電子届 出票作成の参考にしてください。

子どもたちは、全5回のプログラムで学習したこと を思い出しながら、 「昔の人は霧ヶ峰に何をしにきてい

2021年9月以降受験のTOEFL iBTまたはIELTS(Academicモジュール)にて希望大学の要件を 満たしていること。ただし、協定校が要件を設定していない場合はTOEFL

小学校学習指導要領より 第4学年 B 生命・地球 (4)月と星