パソコン活用研究C&C++究め道(C、C++、の活用研究)

数値型と四則演算

C++の数値型と四則演算は、基本的にCとなんらかわるところがないようなので、C入門メモの、画面出力・キーボード入力・変数Cの演算子なども参照して下さい。
ここでは、それらのページとは少し違った観点からまとめてみたいと思います。今回はコンパイラはBorland C++ ver5.5を使いました。


1 数値型
C++における数値型は以下のとおりです。
int    整数型            short  短整数型           long    長整数型
float   実数型            double   倍精度実数型       long double ロング倍精度実数型

int, short, longが何バイトのデータになるかは処理系により異なります。ただし、必ずshort型 <= int型 <= long型の関係になります。
C++にデータ型のサイズを表示するsizeofという演算子がありますので、こいつでBorland C++の各型のサイズをみてみましょう。
#include<iostream.h>

main(){

cout<<"short:"<<sizeof(short)<<endl;
cout<<"int:"<<sizeof(int)<<endl;
cout<<"long:"<<sizeof(long)<<endl;
cout<<"float:"<<sizeof(float)<<endl;
cout<<"double:"<<sizeof(double)<<endl;
cout<<"long double:"<<sizeof(long double)<<endl;
}

実行結果です。
D:\bcc55\Bin>sizeof
short:2
int:4
long:4
float:4
double:8
long double:10




2 四則演算
四則演算は以下の通りです。
+ 加算
- 減算
* 乗算
/ 除算
% 剰余算(余りを求める) 

特に説明することはない部分ですが、ひとつだけ注意しておくべきことは、演算式の中に異なる数値型の変数が混在していると、結果はどうなるかということです。これは、実例をみて検証してみましょう。
         <math.cpp>
#include<iostream.h>

main(){
int a=7, i=3;
float f=3;

cout<<"7+3="<<a+i<<endl;
cout<<"7-3="<<a-i<<endl;
cout<<"7*3="<<a*i<<endl;
cout<<"7/3="<<a/i<<endl;
cout<<"7/3.0="<<a/f<<endl;
}

以下、実行結果ですが、下から2つめのint型同士の割り算では、結果は7/3=2 と整数の結果になっていますが、一番下のint型とfloat型の割り算では実数値の結果がでています。異なる数値型が混在した演算では一番精度の高い変数にあわせた結果になるようです。すなわち、long doubleが存在していれば、long double型に、double型が一番精度が高い変数ならdouble型になります。このルールは暗黙の型変換と呼ばれています。
D:\bcc55\Bin>math
7+3=10
7-3=4
7*3=21
7/3=2
7/3.0=2.33333

それでは、実数型のうち、float型とdouble型でどの程度の精度の違いがでるか、これも実際に検証してみましょう。おなじみの0.01を100回たして1になるかどうかのプログラムです。
        <math2>
#include<iostream.h>

main(){
int i;
float f=0;
double d=0;

for(i=1; i<=100; i++){
f=f+0.01;
cout<<f<<" ";
if ((i%5)==0) cout<<endl; }
cout<<endl;
for(i=1; i<=100; i++){
d=d+0.01;
cout<<d<<" ";
if ((i%5)==0) cout<<endl;}

}

実行結果は以下の通りです。float型では0.84から僅かに計算がずれはじめています。
D:\bcc55\Bin>math2
0.01 0.02 0.03 0.04 0.05
0.06 0.07 0.08 0.09 0.1
0.11 0.12 0.13 0.14 0.15
0.16 0.17 0.18 0.19 0.2
0.21 0.22 0.23 0.24 0.25
0.26 0.27 0.28 0.29 0.3
0.31 0.32 0.33 0.34 0.35
0.36 0.37 0.38 0.39 0.4
0.41 0.42 0.43 0.44 0.45
0.46 0.47 0.48 0.49 0.5
0.51 0.52 0.53 0.54 0.55
0.56 0.57 0.58 0.59 0.6
0.61 0.62 0.63 0.64 0.65
0.66 0.67 0.68 0.69 0.7
0.71 0.72 0.73 0.74 0.75
0.76 0.77 0.78 0.79 0.8
0.81 0.82 0.83 0.839999 0.849999
0.859999 0.869999 0.879999 0.889999 0.899999
0.909999 0.919999 0.929999 0.939999 0.949999
0.959999 0.969999 0.979999 0.989999 0.999999

0.01 0.02 0.03 0.04 0.05
0.06 0.07 0.08 0.09 0.1
0.11 0.12 0.13 0.14 0.15
0.16 0.17 0.18 0.19 0.2
0.21 0.22 0.23 0.24 0.25
0.26 0.27 0.28 0.29 0.3
0.31 0.32 0.33 0.34 0.35
0.36 0.37 0.38 0.39 0.4
0.41 0.42 0.43 0.44 0.45
0.46 0.47 0.48 0.49 0.5
0.51 0.52 0.53 0.54 0.55
0.56 0.57 0.58 0.59 0.6
0.61 0.62 0.63 0.64 0.65
0.66 0.67 0.68 0.69 0.7
0.71 0.72 0.73 0.74 0.75
0.76 0.77 0.78 0.79 0.8
0.81 0.82 0.83 0.84 0.85
0.86 0.87 0.88 0.89 0.9
0.91 0.92 0.93 0.94 0.95
0.96 0.97 0.98 0.99 1


TopPage