2004年度前期プログラミング演習I期末試験 2004年7月28日
学籍番号: 氏名:
問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 2,±5
8,±3 4,±7
8,±1,±5 4,±3
2,±7
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.5∼3.0である.
もちろん、仮数部が2 bitという制限から、誤差が生じたのである.この制限 なしに考えれば、(0.0111)2+ (1.01)2 = (1.1011)2であるから、10進で計算した のと同じ3.375が得られる.
2004年度前期プログラミング演習I期末試験 2004年7月28日
学籍番号: 氏名:
問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
2004年度前期プログラミング演習I期末試験 2004年7月28日
学籍番号: 氏名:
問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;
}