Edited at

【PHP入門講座】 数値・論理値・リソース

More than 5 years have passed since last update.


目次に戻る


数値

数値は更に以下の2つがあります。


  • 整数(int, integer)

  • 浮動小数点数(float, double)

順番に見ていきましょう。


整数



  • intinteger は同じ意味ですが、前者の方がよく用いられます。大文字小文字の区別はありません。

  • 実際には全て10進数として管理されますが、コード上では16進数・8進数・2進数(PHP5.4以降のみ)で表記することも出来ます。16進数では 0x 、8進数では 0 、2進数では 0b を頭につけます。大文字小文字の区別はありません。


PHPコード

var_dump(23);      // 10進数表記

var_dump(0x17); // 16進数表記
var_dump(027); // 8進数表記
var_dump(0b10111); // 2進数表記(PHP5.4以降のみ)


実行結果

int(23)

int(23)
int(23)
int(23)


  • 符号をつけることも出来ます。23+23 は同値です。


PHPコード

var_dump(+23, -23);



実行結果

int(23)

int(-23)


  • 自分の環境での最大値は定数 PHP_INT_MAX によって自動的に定義されています。

  • 具体的に扱える範囲は下記のようになります。

32ビット環境
64ビット環境

最小値
-2147483648
-9223372036854775808

最大値
+2147483647
+9223372036854775807


  • 最小値を下回る・最大値を超える計算や整数以外の数と演算を行った、つまり整数でデータを維持出来なくなったとき、次に紹介する 浮動小数点数 に自動的に変換されます。


PHPコード

var_dump(PHP_INT_MAX, PHP_INT_MAX + 1);



64ビット環境での実行結果

int(9223372036854775807)

float(9223372036854775808)


浮動小数点数


浮動小数点数の予備知識

浮動小数点数はやや難解で、これが完璧に理解できなくてもPHPの学習にはほとんど差支えが無いので、ここではざっくりと解説します。正確な情報が欲しい方はWikipediaをお読みください。

Wikipedia - 浮動小数点数

http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

中学や高校で習った 科学記法 を思い出してください。

例: ファラデー定数

$9.65 × 10^{4} \mbox{C}/\mbox{mol}$

この考え方はまさに 浮動小数点数 そのものであるとも言えます。実際には 基数 である 102 に変換されて管理されていますが、考え方はほとんど同じです。 「有効数字$n$桁まで計算しなさい」 のような問題、ありましたよね。この有効数字部分のことを 仮数 と呼ぶのです。32ビットの仮数精度を持つタイプのものに float、その倍の64ビットの仮数精度を持つタイプのものに double という名前が付けられています。


PHPにおける浮動小数点数



  • floatdouble は同じ意味ですが、前者の方がよく用いられます。

他のプログラミング言語と同じようにPHPの浮動小数点型には single double の2種類がある・・・・・・ように思えますが、実際には全て double です。名前が2種類ついているだけで、実体は全く同じです。これには 歴史的な理由 があるようです。気持ち悪い屁理屈に聞こえますが、PHPにおいてこの屁理屈はこれから先何回か遭遇することになると思うので、割り切っていきましょう。PHPはそういう気持ち悪い面をたくさん持った出来損ないの言語です。

PHPマニュアルから見つかる 歴史的な理由

https://www.google.co.jp/search?hl=ja&q=site:php.net%20%E6%AD%B4%E5%8F%B2%E7%9A%84%E3%81%AA%E7%90%86%E7%94%B1


  • 一般的な表し方です。


PHPコード

var_dump(1.45, -1.0, 0.0);



実行結果

float(1.45)

float(-1.0)
float(0.0)


  • 科学記法を使った例です。 e または E 以降に基数 10 を何乗するかを続けます。


PHPコード

var_dump(9.6485e4);  // ファラデー定数

var_dump(8.9876e-9); // クーロン定数


実行結果

float(96485)

float(8.9876E-9)


非数値(NAN, Not a Number)

PHPで一部の演算を行ってしまった時に、結果が 非数値 になることがあります。


  • この値は定数 NAN によって定義されています。定数なので大文字小文字は区別されます。


  • NAN と何を演算しても結果は NAN になります。


  • NAN と他の何を比較しても結果はFALSE になります。

  • NANNAN を比較しても結果はFALSE になります。

  • ある値が NAN であるか調べるには is_nan 関数を使う方法1つしかありません。


PHPコード

var_dump(asin(1.1)); // アークサインの定義域は-1から1の間



実行結果

float(NAN)



無限大(INF, Infinite, ∞)

PHPで浮動小数点数が膨大、具体的には約 $1.8 × 10 ^{308}$ 以上の値になると、その数は 無限大 に変換されます。


  • この値は定数 INF によって定義されています。定数なので大文字小文字は区別されます。

  • 一度 INF になってしまったものをもとの数に戻すことは出来ません。

  • マイナス無限大も存在します。


PHPコード

var_dump(-1 * INF);



実行結果

float(-INF)




  • INF を用いた際の計算法則は数学界のものに従います。

\frac{1}{\mbox{INF}} = 0 \\

{\mbox{INF}} \cdot {\mbox{INF}} = \mbox{INF} \\
\frac{\mbox{INF}}{\mbox{INF}} = \mbox{NAN}



  • 1 / 0INF / 0 の結果も NAN になると予測されますが、実際にはWarningを発生して FALSEになります。これにも 歴史的な理由 があると思われます。

\frac{1}{0} = \mbox{FALSE with Warning: Division by zero} \\

\frac{\mbox{INF}}{0} = \mbox{FALSE with Warning: Division by zero}


論理値

さっきから何回か FALSE と出てきましたが、これは2つある論理値のうちの1つです。論理値とは、ある事柄 (命題) に関して、それが成り立つか (真)、成り立たないか (偽) を表すものです。


  • 真を TRUE 、偽を FALSE で表します。大文字小文字の区別はありません。

  • if文などでの条件判定には論理値が用いられます(論理値で無い場合には自動変換されます)。


PHPコード

<?php

// 私は一人ぼっちか?
$i_am_alone = true;
var_dump($_am_alone);

// クリスマスの行方は・・・
if ($i_am_alone) {
echo 'Fu*king Christmas!!';
} else {
echo 'Enjoy Happy Christmas!!';
}



実行結果

bool(true)

Fu*king Christmas!!


リソース

プログラミングにおける「リソース」の意味

http://e-words.jp/w/E383AAE382BDE383BCE382B9.html

PHPにおける「リソース」とは、PHPであらかじめ用意されている関数(標準関数)が作成した特別なデータという意味になります。リソース自体を直接プログラマが書き換えることは出来ません。リソースを専用の関数に渡して使うという流れになります。

次のコードを実行してみましょう。

<?php

// shout.txtへのファイルポインタ(ストリーム)リソースを書き込みモード(w)で開く
$fp = fopen('shout.txt', 'w');

// データを書き込む
fwrite($fp, 'Fu*king Christmas!!');

// ファイルポインタ(ストリーム)リソースを解放する
fclose($fp);

PHPファイルが置かれたディレクトリに shout.txt が作成されます。しっかり Fu*king Christmas!! と書き込まれているかどうかも開いて確認してみてください。

また、$fp をダンプすると下記のような結果が得られます。

resource(1) of type (stream)


  • この 1リソースID といい、PHPコード実行中1番目に作られたリソースであることを表します。

  • この stream はリソースの種類を表しています。