講義メモ 後半

p.037 整数と実数:補足

・コンピュータでは整数と実数は扱いが異なるので、厳密に区別されることが多い
・例えば、C系言語では「0」と「0.0」は扱いが異なる
・記憶域においては整数は「完全にその値」が格納されるが、実数は「できる限り近い値」が格納される
・ただし、言語や機能によって、見かけ以上、実数も「完全にその値」が格納されているように見せることが多い
・例:10進数の0.1は2進数にすると0.001100110011…と無限循環小数なので、記憶域の大きさの限りまで格納され、続きは切り捨てられる
 ⇒10進数に戻すと0.1未満になるが、言語や機能によって「0.1」と表されることが多い
・言語や機能や場面によっては0.1ではなく0.09999999998などになり、誤差を生ずる

p.037 整数と実数

・C#では-2,147,483,648から2,147,483,647の値を数字列で書くと(int型)整数リテラルとみなされる
・これは記憶域の大きさで32ビット分を示す
・リテラルとはプログラムの中にデータを記述したもの
・なお「"ハロー!"」は文字列リテラルであり、0文字以上の文字を""で挟んだもの。
 これは記憶域の大きさが不定なので、整数リテラルとは扱われかたが異なる
・先頭または途中に1個だけ「.」を含む数字列は(double型)実数リテラルとみなされる
・2項+演算子は2つのオペランドの両方が実数、又は実数と整数とみなされる場合、実数加算を行い、実数整数を返す
 例: 3.14 + 2.1 ⇒ 5.24、3 + 1.2 ⇒ 4.2、2.1 + 0.9 ⇒ 3.0
・2項-演算子、2項*演算子、2項/演算子も同様
・ただし、この時、右オペランドが実数0.0や実数0.0になる式の場合、文法エラーにはならず、∞が返される
 後述の変数を用いる式で実数0.0になる場合、実行時エラーにはならず、処理が続行される
・UnityのDebug.Logは実数の小数点以下が「.0」の場合に省略するので見かけ上、整数になるが演算は実数を返している
・また、∞を「Infinity」と表示する(負の数を0.0で割った場合(-∞)は-Infinity)

p.037 Chap1_6_3.cs

using UnityEngine;

public class Chap1_6_3 : MonoBehaviour {
    void Start() {
        Debug.Log(2 + 0.5); //整数2と実数0.5の実数加算結果を得て表示
    }
}

アレンジ演習:p.037 Chap1_6_3.cs

・以下を追記して試そう
 3.14 - 2.1 ⇒ 1.04
 3 * 1.2 ⇒ 3.6
 3.5 * 2 ⇒ 7(実数7.0だが「.0」は省略される)
 1 / 7 ⇒ 0(小数点以下切り捨てで整数になる)
 1 / 7.0 ⇒ 0.142857142857143(誤差が出る)
 1.0 / 0 ⇒ Infinity(∞)
 -3 / 0.0 ⇒ -Infinity(-∞) 

作成例

using UnityEngine;

public class Chap1_6_3 : MonoBehaviour {
    void Start() {
        Debug.Log(2 + 0.5); //整数2と実数0.5の実数加算結果を得て表示
        Debug.Log(3.14 - 2.1); // ⇒ 1.04
        Debug.Log(3 * 1.2); // ⇒ 3.6
        Debug.Log(3.5 * 2); // ⇒ 7(実数7.0だが「.0」は省略される)
        Debug.Log(1 / 7); // ⇒ 0(小数点以下切り捨てで整数になる)
        Debug.Log(1 / 7.0); // ⇒ 0.142857142857143(誤差が出る)
        Debug.Log(1.0 / 0); // ⇒ Infinity(∞)
        Debug.Log(-3 / 0.0); // ⇒ -Infinity(-∞) 
    }
}

p.037 整数と実数:補足その2

・整数リテラルでプラスマイナス2の31乗の範囲の外の値を扱うには、長整数リテラルを用いる
・長整数リテラルは数字列の末尾に「L」または「l」をつけたもの(Longの略)
 ※見間違いを起こしやすいので「l」は推奨されないことが多い
・例:2200000000L
・これは記憶域の大きさで64ビット分を示す
・実数リテラルで精度を半分にする代わりに記憶域の大きさを半分にするには、単精度実数リテラルを用いる
・単精度実数リテラルは数字列の末尾に「F」または「f」をつけたもの(Floatの略)
・これは記憶域の大きさで32ビット分を示す
・例:3.14F
・なお、通常の実数リテラルは記憶域の大きさで64ビット分を示す(倍精度実数)
・Unityでは実数計算の結果を整数にすることが多いので(例:座標)大量の実数を誤差をあまり気にせずに効率よく扱うため、
 単精度実数にすることが多い。
・ちなみに、コンピュータは内部的にint型整数、倍精度実数が基本なので、特に必要がなければ、これらを用いる方が効率は上がる

アレンジ演習:p.037 Chap1_6_3.cs

・以下を追記して試そう
・整数リテラル2200000000をDebug.Logで表示できるか試そう
・長整数リテラルが2200000000LをDebug.Logで表示できるか試そう
・倍精度実数3.141592653589793238がどう表示されるか試そう
・単精度実数3.141592653589793238Fがどう表示されるか試そう

作成例

using UnityEngine;

public class Chap1_6_3 : MonoBehaviour {
    void Start() {
        Debug.Log(2 + 0.5); //整数2と実数0.5の実数加算結果を得て表示
        Debug.Log(3.14 - 2.1); // ⇒ 1.04
        Debug.Log(3 * 1.2); // ⇒ 3.6
        Debug.Log(3.5 * 2); // ⇒ 7(実数7.0だが「.0」は省略される)
        Debug.Log(1 / 7); // ⇒ 0(小数点以下切り捨てで整数になる)
        Debug.Log(1 / 7.0); // ⇒ 0.142857142857143(誤差が出る)
        Debug.Log(1.0 / 0); // ⇒ Infinity(∞)
        Debug.Log(-3 / 0.0); // ⇒ -Infinity(-∞) 
        Debug.Log(2200000000); //長整数リテラルだがL無でもエラーにならない
        Debug.Log(2200000000L); //長整数リテラルなのでLをつける方が良い
        Debug.Log(3.141592653589793238); //3.14159265358979になる
        Debug.Log(3.141592653589793238F); //3.141593になる
    }
}

p.38 長い式では計算する順番を意識する

・一般的に四則演算を連続で行う場合のルールは下記の通りで、C#でも同じ
 ①左から順に行う
 ②ただし、積算と除算は加算と減算より優先して行う
・これに整数演算か実数演算かも関連するので、どこまでが整数演算になるのかもポイント
・例: 1 + 2 + 2.1 + 3 
 ① 1 + 2 まで整数演算で整数3になり
 ② 3 + 2.1 となって続行され実数演算で5.1になり
 ③ 5.1 + 3 となって続行され実数演算で8.1になる
・例: 2.9 + 2.1 + 3 
 ① 2.9 + 2.1 まで実数演算で実数5.0になり
 ② 5.0 + 3 の実数演算で実数8.0になる(整数8にはならない)

提出:アレンジ演習:p.037 Chap1_6_3.cs(どのバージョンでもOK)

コメントを残す

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