• ベストアンサー

勉強の参考にさせて下さい

前回と同じようにもう一つ過去問を手に入れたのですが、同じく回答が手に入らず困っています。 大変お手数だとは思いますが、もうすぐ行われる期末テストの参考にしたいので、出来る範囲で構いませんのでもしどなたか解いて頂ければ大変うれしく思います。 どうかよろしくお願いいたします。 引き放し法除算において各ステップで次のような処理を行うことで,整数の除算を実行でき る.但し,ri はi ステップ目の中間余り, qi は商のi ビット,D は除数である. ・中間余りを左シフトして2ri-1 を求める. ・if(2ri-1 * D >= 0) qi = 1; else qi = -1; ・ri = 2ri-1 - qi D (1) 被除数(X):00100110 (38),除数(D):0110 (6)のときのこの方式による除算ステップを 示せ. (2) 被除数(X):11011010 (-38),除数(D):1010(-6)のときのこの方式による除算ステップを 示せ. [3]IEEE754 標準浮動小数点数に関して以下の問に答えよ. (1)0xafbf0000 という表現のfloat 数の10 進の値(m X 2e の形式でよい)を求めよ. (2)-938.8125 のfloat 表現(16 進数)を求めよ. (3) int では表現できないが,float なら表現できる整数のうち,次の数を求めよ. (a) 正で絶対値が最小(最も0 に近い) (b) 負で絶対値が最小(最も0 に近い) [4]キャスト操作やfloat/double データ型を使用せずに,入力された数のビットを処理して, int/unsigned 数をIEEE754 表現のfloat にキャストする関数とそのドライバをC 又はC++ を用いて次のように書け. (1)処理関数:次のいずれかを選択して書け. (a) unsigned iToF(int): int 数をfloat に変換し,unsigned 数として返す.ま るめはIEEE default の“nearest, half way case to even”. (b) unsigned uToF(unsigned): unsigned 数をfloat に変換し,unsigned 数と して返す.まるめは切り捨て. (2)main 関数: 整数(無符号整数)を入力するとiToF(uToF)を用いて浮動小数点数 に変換してそのビットパターンを16 進で出力せよ.次に,そのfloat としての値を再度出 力し,入力した値と比較してみよ.それらは必ず一致するか.

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

[3] IEEE754 標準浮動小数点数については, 下記ja.wikipediaの「1.3.2 32ビット単精度」を参照。 http://ja.wikipedia.org/wiki/IEEE_754 (1) 1 01011111 01111110000000000000000 = afbf0000 S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF バイアスは +127=(01111111)2 なので, -(1.0111111)2 × 2の-32乗。 メンドウなので10進数への基数変換はご自身でしていただけますか。 (2)   (-938.8125)10 = (1110101010.1101)2 ×2の0乗 = (1.1101010101101)2 ×2の9乗 バイアス後の指数部は 9+127=(10001000)2 なので, 0 10001000 11010101011010000000000 = 446ab400 S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF (3) int型は32bit長の整数型であり,最大値は (2の31乗)-1,最小値は -(2の31乗)。 よって「int では表現できないが,float なら表現できる整数」の中から答えると, (a) は (2の31乗) が解答となる。 バイアス後の指数部は 31+127=(10011110)2 なので, (a) 0 10011110 00000000000000000000000 = 4f000000 S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF (b) は精度が十分に長いなら -(2の31乗)-1 が解答となるが, floatの精度は23bit(隠れ"1"表現を含めて24bit長)しかない。よって,   -(1.)000 0000000000 0000000001 ×2の31乗 = -(2の31乗)-2の8乗 が解答となる。 (b) 1 10011110 00000000000000000000001 = cf000001 S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF

Marcocemarco
質問者

お礼

重ね重ね丁寧な解答、誠にありがとうございます!! 是非活用させて頂きます!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ソフ開の問題集について

    こんにちは。さっそくですが質問させていただきます。 日高哲郎氏の著作 「2006秋 ソフトウェア開発技術者 午後問題集」 の第二章アルゴリズム 演習4 BNF についてなのですが、 構文規則で定義される 言語のなかで byte 8ビット 補数表現の整数 short 16ビット 補数表現の整数 char 16ビット 符号なし整数 int 32ビット 補数表現の整数 を扱うのようなのですが <演算子> の定義の中にシフト演算子があり、 '<<' 空いたビットに符号ビットを入れる '<<<' 空いたビットに 0 を入れる とありました。 ----------------------------------------------------- 設問4の(2) の問題文はつぎのようなものでした。 シフト演算子<< は(1)のように除算演算子で置き換え可能である [ (1) については省略させていただきます。] ~中略~ 除算演算子をシフト演算子に置き換え可能なのは 除数および被除数がどのような場合か ----------------------------------------------------- 正解は 除数 2 のべき乗のとき 被除数 char型で32767以下の場合、またはchar型以外のとき なのですが、これはそれぞれの型においての最上位ビットの 扱いからだと思うのですが、 ( char型以外は 2 の補数表現の整数 ) 質問させていただきたいのは本の正解に対する 解説についてなのです。 ----------------------------------------------------- 解説文においては 「・・・符号ビットを意識しないchar型であると 最上位ビットに 1 が入っていると右シフトの結果空いたビットに 0 が入ってしまうため数値としてみた場合、正しい結果が得られない。 ・・・」 とあるのですが、空いたビットに 0 が入れば数値として 正しくなるのではないでしょうか? そしてこの場合、char型の最上位ビットに 1 が入っていると シフトしたら、空いたビットに 1 が入るので数値としては 正しくなくなるのではないでしょうか? 自分の理解に自信が持てないので、このような質問を させていただきましたが、 ご存知のかた、教えていただけないでしょうか? よろしくおねがいします。

  • C言語

    C言語の問題が分からなくて困ってます。 時間がないのでわかる方教えていただけますでしょうか。次の1️⃣2️⃣3️⃣です。 整数割り算の結果と余りを同時に求める関数 div_mod_intを作成せよ。 ただし、ゼロ割り算は考慮しなくて良い。 * 整数割り算の結果と余りを同時に求める関数を作成 #include <stdio.h> int input_int(int *pd); void div_mod_int(int data1, int data2, ____1⃣____); int main(void) { int data1, data2; int syou, amari; while (input_int(&data1) != EOF && input_int(&data2) !=EOF) { div_mod_int(data1, data2, ____2⃣____); printf("%d / %d = %d...%d\n\n", data1, data2, syou, amari); } return 0; } /* * 整数割り算を行い商と余りを求める * 引数 int data1 :被除数 (割られる数) * int data2 : 除数 (割る数) * int data1 / data2 : 除算結果 * int data1 % data2 : 余り * 戻り値 void :なし */ void div_mod_int(int data1, int data2,____1⃣____) { ____3⃣____ __________ }

  • 四則演算についてです

    四則演算の除算法についてですが {23/6}を2進数で求めたいです。 但し、被除数は6ビット、除数は4ビットという条件付き。 23=(0 10111)2 6=(0 110)2 2の補数を用いて-6=(1 010)2 減算結果が正の場合、商として1をたて 減算結果が負の場合、商として0を立てるのですが 010111 +)1010    商 --------- 111111 …0 +) 1010 --------- 1010011 …0 +) 1010 --------- 1101 …0 +) 1010 --------- 10111 となってしまい商と余りがうまく出ません! 間違ってるところ教えてください!

  • プログラミングがわかりません

    1.多倍長数で表現した整数aとint型で表現した整数xを乗算し、その結果をaに格納するプログラムを作れ。 #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 0, 0, 1, 0, 2, 4, 6, 5, 5, 3, 6}; int x = 512; /*必要な変数があれば適宣宣言しなさい*/ /*多倍長数(c) <-- 多倍長数(a) * int型(x)*/ (ア) 出力省略 return 0; } 実行結果 a = 52462354432 2.多倍長数を用いて1から80までの各整数の階乗を計算し、正しい値を表示するプログラムを作れ。 注意 80の階乗を表現するためには、少なくとも119桁の整数を格納できる多倍長数を用いなければならない。 実行結果 1! = 1 2! = 2 3! = 6 ・・・ 3.多倍長数で表現した整数aとint型で表現した整数xで除算し、その結果をaに格納するプログラムを作れ。 aがxで割り切れない場合に生じるあまりは使用せずに捨ててもよい。 除算の途中で現れる整数はint型で表現できる範囲であることを仮定してもよい。 ソースコード #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1}; int x = 365; /*必要な変数があれば適宣宣言しなさい*/ /*多倍長数(a) <-- 多倍長数(a) ÷ int型(x)*/ (ア) return 0; } 実行結果 a = 33823777 2はまったくわかりません 1,3の出力はわかるのですが、計算過程がわかりません 教えてくださいよろしくお願いします。

  • 浮動小数点の扱い

    double型の0以上1未満の数を整数で表現しようとしています。 その法則は360を基準として 0なら整数表現は359 0.999なら整数表現は0 0.5なら整数で表現は180 のようにします。 double d; int i d = 0.5; i = ここまで考えましたが続きはどうしたらいいでしょうか?

  • VC++6.0でC言語の基本データ型のビット長と範囲をしりたいです

    VC++6.0を使用しています。コマンドラインを使い勉強しているのですが、基本データ型のビット長と使える数の範囲を知りたいです。 たとえば、int型だと32ビットで-32767から32767の範囲の数を扱えるとかを知りたいです。コマンドライン上から調べることはできないのでしょうか? ネットでも書いてあるところがあるならいいのですが、できれば自分の手で調べる方法を見つけたいのです。 ちなみに char, unsigned char, int, unsigned int, short int, unsigned short int, long int unsigned long int, float, double, long doubleなどが知りたいです。 方法を知っている方教えてください。よろしくお願いします。

  • 0除算を判定したい

    0除算とは例えば10を0で割ったら結果が無限大になるように、ある数を0で割った時に起こる現象です。 しばしばこの0除算に悩まされるので、ある式を代入したらそれが0除算であるかどうかを判定できたらと思いました。 そこで下のような関数を作れたらと思っているのですが、 ある式を見てその結果が0除算であるかを判定する方法はありますでしょうか? int isDivide0( float val ) {   if ( val == 0除算 )     return 1;   else     return 0; } int main() {   isDivide0( 10 / 0 ); } 尚、開発環境はVisual Studio2005です。

  • 型変換??

    int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4.  static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • アセンブラで割り算

    アセンブラ記述で割り算を実現させたいのですがよくわかりません。 下記条件でどのように実現すればよいでしょうか。 ・8ビット÷4ビット ・命令セットは  LDL, LDH, MOV, ADD, SUB, SRA, SR, SL, AND, OR, JE, JMP, CMP, LD, ST, HLT ・レジスタは16ビット ・レジスタは8個 です。 「被除数の上位4ビットと除数を比較して商を求めて、余りに被除数の次ビットを連接する」 の繰り返しでできると思っているのですが、アセンブラ表記がわかりません。 よろしくお願いします。