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

となるが、仮数部は2 bit しかないので

N/A
N/A
Protected

Academic year: 2021

シェア " となるが、仮数部は2 bit しかないので "

Copied!
3
0
0

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

全文

(1)

2004年度前期プログラミング演習I期末試験 2004728

学籍番号: 氏名:

問1:

(1)実数xを、基数b= 2, 全体の幅が5 bit,符号部に1 bit,指数部に2 bit,仮

数部に2 bit使う浮動小数点数で表す.ただし、ケチ表現を使い、また指

数部にバイアス1を足す.すなわち x= (−1)s×2e×

Ã

1 +

X2 k=1

fk2−k

!

,

s= 0,1. また、バイアス1を足した後のeは、0≤e≤2の範囲.この状 況で表すことのできる実数をすべて数直線上に表せ.

(2)0.875 + 2.5を、上と同じ状況で、それぞれを浮動小数点表示に直してから 計算せよ(計算過程も記述せよ).

解答:

解答例:(1)仮数部のみ考えると、1 +f12−1+f22−2,f1, f2 = 0,1なので、とり 得る値は1,1 + 1/4 = 5/4,1 + 1/2 = 3/2,1 + 1/2 + 1/4 = 7/4. 更に、指数部は 2−1,20 = 1,21のいずれか(バイアスを加えて0≤e≤2だから).また、s= 0 ならxは正、s= 1ならxは負となる.これらすべての組合せから、xのとり得 る値は

1 25

83 47

8,±1,±5 43

27

4,±2,±5

2,±3,±7 2}.

これを数直線上に図示すればよい.

(2)0.875 = 0.5 + 0.25 + 0.125 = 2−1+ 2−2+ 2−3 だから、0.875 = (−1)0×2−1× (1 + 1·2−1+ 1·2−2). つまり仮数部は(1.11)2. 同様に2.5 = (−1)0×2−1×(1 + 0·2−1+ 1·2−2). 仮数部は(1.01)2となる.

0.875 = (−1)0×2−1×(1.11)2 = (−1)0×21×(1·2−2+1·2−3+1·2−4) = (−1)0× 2−1 ×(0.0111)2となるが、仮数部は2 bit しかないので、(0.0111)2 (0.01)2.

仮数部の足し算(0.01)2+ (1.01)2 = (1.10)2 = 1 + 2−1であるから、指数部21 を掛けて、0.875 + 2.53.0である.

もちろん、仮数部が2 bitという制限から、誤差が生じたのである.この制限 なしに考えれば、(0.0111)2+ (1.01)2 = (1.1011)2であるから、10進で計算した のと同じ3.375が得られる.

(2)

2004年度前期プログラミング演習I期末試験 2004728

学籍番号: 氏名:

問2: 自然数a, bが互いに友愛数(amicable number)であるとは、aの約数で aより小さいものすべての総和がbに等しく、かつ、bの約数でbより小さいも のすべての総和がaに等しいことをいう.例えば、220,284は互いに有愛数で ある.

以下のプログラムは、入力された自然数が互いに有愛数であるか否かを判定 するものである.空欄(1)、(2)、(3)を埋めよ.

#include <stdio.h>

int

main (void) {

int a, b, s = 0, t = 0, i, j;

printf ("input a: ");

scanf (/* (1) */);

printf ("input b: ");

scanf (/* (2) */);

for (i = 1; i < a; i++) if (a % i == 0)

s += i;

for (j = 1; j < b; j++) if (b % j == 0)

t += j;

if (/* (3) */)

printf ("%d and %d are amicable (s = %d, t = %d).\n", a, b, s, t);

else

printf ("%d and %d are not amicable (s = %d, t = %d).\n", a, b, s, t);

return 0;

}

解答:

解答例:(1)"%d", &a (2)"%d", &b (3)s == b && t == a

(3)

2004年度前期プログラミング演習I期末試験 2004728

学籍番号: 氏名:

問3: キーボードから5人分のテストの点数(int型とする)を入力させ、最高 点、最低点、平均を出力するコードを記述せよ.ただし平均点はdouble型とす る.

解答:解答例:

#include <stdio.h>

#define NUM 5

int

main (void) {

int i, score[NUM], sum = 0, min, max = 0;

printf ("input %d scores.\n", NUM);

for (i = 0; i < NUM; i++) {

printf ("%dth score? : ", i);

scanf ("%d", &score[i]);

}

for (i = 0; i < NUM; i++) {

sum += score[i];

if (max < score[i]) max = score[i];

}

min = score[0];

for (i = 0; i < NUM; i++) if (min > score[i])

min = score[i];

printf ("min = %d, max = %d, mean = %f.\n", min, max, (double) sum / NUM);

return 0;

}

参照

関連したドキュメント