計算をしよう
このパートでは、C++での計算について学んでいきます。
整数の計算
計算はプログラミングのメインと言っても過言ではありません(過言です)。まずは整数の計算からやってみましょう。
C++に限らず多くのプログラミングでは、計算に「演算子」を使います。演算子には以下のものがあります。
演算子 | 役割 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 剰余 |
上の4つは聞き覚えがあると思います。一番下の「剰余」というのは「余り」のことです。実際に使ってみましょう。
#include <iostream>
using namespace std;
int main(){
cout << 10 + 8 << endl;
cout << 10 - 8 << endl;
cout << 10 * 8 << endl;
cout << 10 / 8 << endl;
cout << 10 % 8 << endl;
}
これを実行すると、以下のような出力が返ってきます。
18
-2
80
1
2
ここでポイントなのが減算と除算の結果です。まず、減算ではしっかりと負数も表現できています。そして、除算は少しおかしいですね。10÷8=1.25 のはずですが、1という結果になっています。つまり、小数点以下が切り捨てられています。これは次に説明する浮動小数点数の計算で解決できます。
コラム - オペランドと演算子
今、演算子について説明していますが、それに対応して「オペランド」というのもがあります。
オペランドとは演算の対象となる値(足す数・足される数・かける数・かけられる数...)のことです。先ほどの例の中では10や8がそれに該当します。
つまり、演算は
(オペランド) (演算子) (オペランド)
という形になるわけです。エラーを読むときにオペランドという言葉はよく出てくるので覚えておきましょう。
浮動小数点数の計算
まず、浮動小数点数とは何か、から説明していきましょう。
浮動小数点数は、いわゆる小数です。ただ、小数と呼ばずに、浮動小数点数と呼んでいるのにはちゃんと意味があります(実際小数と浮動小数点数は少し違います)。ただ、これを説明すると少し難しくなるので(あと中学一年生の知識だと理解できないと思います)説明は省略します。詳しく知りたい人はGoogleで「浮動小数点数」と調べるとわかると思います。
とにかく、浮動小数点数は小数を表していると覚えておいてください。
話を戻しましょう。浮動小数点数の計算は整数と同じようにすることができます。しかし、%(剰余)は使えません。
#include <iostream>
using namespace std;
int main(){
cout << 1.4 + 0.7 << endl;
cout << 1.4 - 0.7 << endl;
cout << 1.4 * 0.7 << endl;
cout << 1.4 / 0.7 << endl;
}
実行結果
2.1
0.7
0.98
2
うまく計算できています。
浮動小数点数の危険性
唐突ですが、プログラマー界隈では浮動小数点数というものはしばしば嫌われています。その理由が浮動小数点数の誤差です。しかし、先ほどの例ではしっかり計算できていました。ではどこで誤差が発生しているのでしょうか。
その確認のために、桁数を指定して小数を出力させてみましょう。少し高度な記述をしますが、ここでは説明しません。あくまで浮動小数点数の誤差の確認のためのソースコードです。
#include <iostream>
using namespace std;
int main(){
cout << setprecision(30) << 0.1 << endl;
}
軽く説明すると、これは0.1という値を小数第30位まで出力させています。出力は以下のようになると思います。
0.100000000000000005551115123126
小数第18位くらいから乱れていますね。たかが小数第18位かと思うかもしれませんが、プログラミングでは巨大な数を扱うことも少なくありません。そのため、小さな誤差でも大きな誤差になりえてしまいます。
このように、浮動小数点数で誤差が起きてしまう原因は、数値を2進法で表現しているからです。整数を2進数で表現する場合、桁は1の位、2の位、4の位...となりますが、少数の場合は1の位、1/2の位、1/4の位...となり、0.1などの2進数で表現できない数が出てきてしまいます。
浮動小数点数と整数の計算
浮動小数点数と整数を計算させた時は答えは基本的に浮動小数点数になります。しかし、もし答えが整数で表現できる時(0.1*10など)は整数になります。
複雑な計算・計算の優先順位
演算には、もちろん「()」を使うことができます。しかし、「{}」や「[]」は使うことができません。そのため、()を入れ子にする必要があります。こんな感じです。
#include <iostream>
using namespace std;
int main(){
cout << 5*(10*12+(3+4)*3) << endl;
}
出力結果
705
また、演算には優先順位もあります。基本的に数学と同じで、乗算・除算が最優先で加算・減算がその次になります。ちなみに、剰余(%)は乗算・除算と同じ優先度になっています。そして、少し意外かもしれませんが、計算は必ず左から右に行われるわけではないということを覚えておいてください。
コラム - ゼロ除算
C++でもゼロ除算(10/0など)をしてはいけません。処理上未定義という、C++で決められていない動作になってしまうからです。もし行ってしまった場合、エラーが発生してしまいます。
では、このパートは終了です! 好きな計算(考査の得点計算でもいいです)をしてみてください