講義メモ

・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);
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です