・p.48「浮動小数点数型」から再開します
提出フォロー:ミニ演習 mini046.cs
・p.46 type02.cs を元にして、下記の仕様のプログラムを作成しよう ①コンソールから整数A、Bを入力 ②AとBの和、差、積、商、平均値を表示する ※商と平均値は小数点以下切り捨てでOK
作成例
//ミニ演習 mini046.cs
using System;
class mini046
{
public static void Main()
{
Console.Write("整数Aを入力してください---"); //改行しない
int a = int.Parse(Console.ReadLine()); //文字列として入力し整数化した値で初期化
Console.Write("整数Bを入力してください---"); //改行しない
int b = int.Parse(Console.ReadLine()); //文字列として入力し整数化した値で初期化
Console.WriteLine("A + B = {0}", a + b); //整数化したので計算可
Console.WriteLine("A - B = {0}", a - b); //〃
Console.WriteLine("A * B = {0}", a * b); //〃
Console.WriteLine("A / B = {0}", a / b); //〃(整数商になる)
Console.WriteLine("平均は{0}", (a + b) / 2); //〃(〃)
}
}
p.48 浮動小数点数型
・小数点を持つ値を実数といい、小数点の扱い方に固定小数点方式と浮動小数点方式がある。 ・C#では格納効率が良い浮動小数点方式を採用している ・浮動小数点方式による実数を浮動小数点数という ・実数には誤差がつきものであり、特にコンピュータでは全ての値を2進数で扱うため、10進数で無限小数になる値(1÷7、円周率など)は 2進数でも無限小数であり、10進数の0.1なども2進数では無限小数になってしまう。 ・よって、例えば、実数の1.0は1.00000000001かもしれないし0.9999999999かもしれないとみなされる ・この理由により、C#などでは整数と実数の扱いがまったく異なり、例えば2と2.0は違う扱いになる (ただし、Console.WriteLineなどでの表示では「.0」が省略されることが多い ・C#では浮動小数点数に2種類の精度がある ①単精度:精度が低い代わりに占有するメモリが小さい。floatまたはSingleといい1つ32ビット。 ②倍精度:占有するメモリが大きい代わりに精度が高い。doubleまたはDoubleといい1つ64ビット。 ・通常、処理効率は②の方が良いが、Unityなどの大量の座標を扱うツールでは①の利用が多い。 ※テキストp.48下から3行目の記述は、Unityなどには当てはまらない。使い分けがポイント。 ・なお、C#では桁数が多い実数は「3.402823E+38」のような指数表記で示される。 ・指数表記は実数を「0以上10未満の数値×10の●乗」で表すもので例えば「1.2E+3」は「1200」のこと。 ・よって、float型の最大値は3.402823×10の38乗=340282300000000000000000000000000000000 ・なお、「1.2E-3」は1.2×(1/10の3乗)=0.0012
アレンジ演習:p.49 type04.cs
・float型の変数fpiと、double型の変数dpiを、円周率3.14159265358979323846 で初期化する ※文法エラーになるのでfpiの初期値の末尾にはFをつけること(理由はp.59で後述) ・この2つの値を表示して、有効桁数を確認しよう
作成例
//アレンジ演習: p.49 type04.cs
using System;
class type04
{
public static void Main()
{
Console.WriteLine("float: {0}~{1}", float.MinValue, float.MaxValue);
Console.WriteLine("double:{0}~{1}", double.MinValue, double.MaxValue);
//【以下追加】
float fpi = 3.14159265358979323846F; //円周率をfloat型扱いにして初期値に
double dpi = 3.14159265358979323846;
Console.WriteLine("fpi : {0}", fpi); //3.141593
Console.WriteLine("dpi : {0}", dpi); //3.14159265358979
}
}
p.49 浮動小数点数型:浮動小数点数型の値を返すメソッドの例(Math.Pow)
・実数値で元の値と乗数を渡すと、べき乗の結果をdouble型で返すMath.Powメソッドが提供されている ・Math.Powは静的メソッド(後述)なので、特に準備なく「Math.Pow(実数, 実数)」で呼び出してOK ・Console.WriteLineやConsole.Writeの中で↑を呼び出せば、結果として得られた実数値を表示できる ・あるいは、式の中で↑を呼び出せば、結果として得られた実数値を計算に用いることができる 例: type05.csの「bw / Math.Pow(bl , 2.0)」は「blの値の2乗で変数bwの値を割った結果」
アレンジ演習:p.50 type05.cs
・BMI(肥満係数)を得るプログラムだが、身長の単位がメートルなので誤解しやすい ・身長をセンチメートル単位で入力できるようにしよう ・BMIの計算式を変更しても、その前にメートル単位に換算しても良い
作成例
//アレンジ演習:p.50 type05.cs
using System;
class type05
{
public static void Main()
{
Console.Write("身長(cm)--- "); //【変更】
double bl = double.Parse(Console.ReadLine()) / 100; //【変更】
Console.Write("体重(kg)--- ");
double bw = double.Parse(Console.ReadLine());
Console.WriteLine("BMI = {0:##.#}",
bw / Math.Pow(bl, 2.0));
}
}
p.50 decimal型
・実数には誤差がつきものなので、1つあたりの記憶域の量を倍にすることで、誤差を最小化するものがdecimal型。 ・decimal型は1つ128ビット(floatの4倍、doubleの2倍)で、精度は小数点以下28桁。 ・なお、decimal型の変数の初期値や代入値をリテラルで示す場合、decimal型にする必要がある。 ・この仕掛けをサフィックス(p.59)といい、decimal型のサフィックスは「M」または「m」。
アレンジ演習:p.51 type06.cs
・decimal型の変数mpiを、円周率3.14159265358979323846 で初期化する ※文法エラーになるのでmpiの初期値の末尾にはMまたはmをつけること(理由はp.59で後述) ・この値を表示して、有効桁数を確認しよう
作成例
//アレンジ演習:p.51 type06.cs
using System;
class type06
{
public static void Main()
{
Console.WriteLine("decimal:{0}~{1}", decimal.MinValue, decimal.MaxValue);
decimal mpi = 3.14159265358979323846M; //decimal型扱い
Console.WriteLine("mpi = {0}", mpi); //この場合、誤差無し
}
}
p.52 type07.cs 補足
・ソースの中でサフィックスが「100M」だったり「1m」だったりと大文字小文字が混じっているが、 通常、どちらかに統一するのがコーディングルール(チームや会社における書式ルール)。
p.52 type07.cs
//p.52 type07.cs
using System;
class type07
{
public static void Main()
{
decimal total; //元利合計
Console.Write("借入金額---");
decimal a = decimal.Parse(Console.ReadLine()); //入力しdecimalに変換
Console.Write("利息(%)---");
decimal p = decimal.Parse(Console.ReadLine()); //入力しdecimalに変換
decimal r = p / 100M; //利息をパーセンテージから小数にする
total = a * (1M + r); //decimal型の1に利息を加算し借入金額に掛ける
Console.WriteLine("1期間後の元利合計は{0:c}です", total); //通貨形式(p.31)
a = total; //元利合計が次の借入金額になる(複利)
total = a * (1M + r);
Console.WriteLine("2期間後の元利合計は{0:c}です", total);
a = total;
total = a * (1M + r);
Console.WriteLine("3期間後の元利合計は{0:c}です", total);
a = total;
total = a * (1M + r);
Console.WriteLine("4期間後の元利合計は{0:c}です", total);
}
}