第15講 構造体の学習

第1話 浮動小数点型変数
あなたが小学生だとすると、あなたはいろいろなデータをもっています。
出席番号・名前・国語の成績・社会の成績・算数の成績・理科の成績・各教科の成績などです。
この用の複数のデータを集めて1つの塊にしたものを構造体といいます。

今挙げたデータは、各教科の平均と名前以外はすべて整数型(int型またはchar型)で扱えますが、
各教科の成績は、小数になり、名前は『赤池 光太郎』(仮名)等となり、整数型では扱えません。
ですが、本講義では小数と文字列(複数の文字を文字列といいます。)
を扱う変数についてはまだ学んでいません。
そこで、第1話では小数を表す浮動小数点型について学び、
第2話では、文字列変数について学んでから構造体について学習することにしましょう。

まず、浮動小数点型からです。
浮動小数点型型変数の宣言は、
float a;
または、
double a;
として宣言します。
floatの方は、単精度浮動小数点型といい、
001002の範囲の浮動小数点型を
doubleの方は、倍精度小数点型と呼び、
003004の範囲の浮動小数点型を扱います。
001は34000〜00(0の数が37個)を表します。
005=1000〜00(0の数が38個)であるからです。
005は10の38乗と読み、10を38回かけること表します。
すなわち、
007
ということです。
008009=0.00〜001(小数点前の0を含めて0が38個)を意味します。
浮動小数点に浮動が付いているのは、
2789.321=010というように、小数点が移動するからです。
試しに、第1講第7話で作ったプロジェクトaまたは第3講第1話で作ったプロジェクトbを開いて、
コードを次のように打ってみてください。
#include<stdio.h>
void f(); //単精度浮動小数点型を表示する社員
void g(); //倍精度浮動小数点型を表示する社員
int main(){
  f();
  g();
  return(0);
}
void f(){
  float a;
  a=123456789.123456789;
  printf("a=%f\n",a);
  printf("a=%e\n",a);
}
void g(){
  double a;
  a=123456789.123456789;
  printf("a=%f\n",a);
  printf("a=%e\n",a);
}
コピペ用添付ファイル
実行結果
a=123456792.000000
a=1.234568e+008
a=123456789.123457
a=1.234568e+008

小数点が浮動しています。
a=1.234568e+008
はa=1.234568×10の8乗
を意味します。
a=123456789.123457
において、小数第7位以降がないのは、
doubleの有効桁数が15桁であるために第7位が四捨五入されているからです。
また、
a=123456792.000000
が正確でないのはfloatの有効桁数7桁を超えてしまっているのが理由です。

float型は4バイト、double型は8バイトのメモリ容量があります。
普通はメモリ容量が小さいほど、
処理速度が速くなります。
ですから、float型の方が速そうに思いますが、
実際には、double型の方が速いのです。
というのは、今のコンピュータはdouble型を専用に扱う回路が付いており、
float型でも一度double型に変換して計算してから再びfloat型に変換しているというのが理由だそうです。
実際にコードを次のように変更して実験してみましょう。
#include<stdio.h>
#include<time.h>
void f(); //単精度浮動小数点型を表示する社員
void g(); //倍精度浮動小数点型を表示する社員
int main() {
  f();
  g();
  return(0);
}
void f() {
  float a, i;
  clock_t c1, c2; //現在時刻を入れる変数
  c1 = clock(); //現在時刻をゲット
  a = 0;
  for (i = 0; i <= 10000; i += 0.01)a += i;
  c2 = clock(); //現在時刻をゲット
  printf("float型の場合の計算時間:%d\n", c2 - c1);
  printf("a=%f\n", a);
}
void g() {
  double a, i;
  clock_t c1, c2; //現在時刻を入れる変数
  c1 = clock(); //現在時刻をゲット
  a = 0;
  for (i = 0; i <= 10000; i += 0.01)a += i;
  c2 = clock(); //現在時刻をゲット
  printf("double型の場合の計算時間:%d\n", c2 - c1);
  printf("a=%f\n", a);
}
コピペ用添付ファイル
残念ながらvc++ 2010では、

と余り差が出ませんが、
vc++2017だと、

と明確な差が出ます。
確かに、double型の方が速いことがわかります。
尚、計算結果が異なっていませんが、
float型は有効桁数が7桁しかないために誤差が出ています。

そうすると、皆さんはfloat型は覚える必要がないということになりそうです。


第14講第8話へ   第2話へ

第2部目次に戻る  第1部目次に戻る

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
ecliqse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ