• 締切済み

プログラミングの問題が分かりません。

以下の実行結果を元に、float型変数 f に与えた実数の実際に格納されているビット列を表示するプログラムを作成しろ。 という問題です。 実行結果: Size of Float : 4 byte Size of Int : 4 byte f=0.500000000000000 00111111000000000000000000000000 ご教授お願いします。

みんなの回答

  • Quant
  • ベストアンサー率18% (23/122)
回答No.5

C++で簡潔に #include <bitset> #include <iostream> #include <iomanip> using namespace std; int main() { float f; f = 0.5; cout << "Size of Float : " << sizeof(float) << " byte" << endl; cout << "Size of Int : " << sizeof(int) << " byte" << endl; cout << "f=" << setiosflags(ios::fixed) << setprecision(15) << f << endl; cout << (bitset<32>)*(int *)&f << endl; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

面白いので分かりにくさで勝負 #include <stdio.h> int main() { float f = 0.5; printf("Size of Float: 4 byte\nSize of Int: 4 byte\nf=%.15f\n", f); for (int i = 32; i; ) putchar("01"[*(unsigned int *)&f >> --i & 1u]); putchar('\n'); return i; } 結果が処理系依存なのは最初から分かり切ってるので, いかに「変態的」に書けるかを考えてみたんだけど今一つな感じもする. あまり「分かりにくさ」もないような気がするし.

回答No.3

#include <stdio.h> int main() { float f=0.5f; unsigned int mask; for ( mask=1<<31; mask>0; mask>>=1 ) printf("%d",!!(mask&*(unsigned int*)&f)); printf("\n"); } C言語では、ビット演算の被演算子は整数型に限られるので、float変数の記憶場所を、整数の記憶場所であるかのように処理させるために、ポインタをint*にキャストするという方法をとることにしました。

回答No.2

#include <stdio.h> int main(void) {  float f;  int i,l;  f = 0.5;  i = *(int *)&f;  printf("Size of Float : %d byte\nSize of Int : %d byte\nf=%.15f\n",sizeof(float),sizeof(int),f);  for (l = sizeof(int) * 8;l--;i <<= 1) putchar((i < 0) + '0'); putchar('\n');  return 0; } あえて、わざと「言語(コンパイル環境)に依存しまくりで、解りにくく混乱しそうな書き方の典型」で書いてみた。言語依存なので、使用するコンパイラによっては、おかしな結果が表示される。 そのため、もし、これが「学校の課題」だった場合、そのまま提出すると「これでは点数はあげられない。減点」と言われると思う。 なので「これを参考に、自分で考えて、自分で作ったプログラム」を提出すること。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

そういえば数学のカテゴリーで似たような問題があったなぁ.... あれじゃダメなんだろうか.