目次に戻る
数値
数値は更に以下の2つがあります。
- 整数(int, integer)
- 浮動小数点数(float, double)
順番に見ていきましょう。
整数
- int と integer は同じ意味ですが、前者の方がよく用いられます。大文字小文字の区別はありません。
- 実際には全て10進数として管理されますが、コード上では16進数・8進数・2進数(PHP5.4以降のみ)で表記することも出来ます。16進数では
0x
、8進数では0
、2進数では0b
を頭につけます。大文字小文字の区別はありません。
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
は同値です。
var_dump(+23, -23);
int(23)
int(-23)
- 自分の環境での最大値は定数
PHP_INT_MAX
によって自動的に定義されています。 - 具体的に扱える範囲は下記のようになります。
32ビット環境 | 64ビット環境 | |
---|---|---|
最小値 | -2147483648 | -9223372036854775808 |
最大値 | +2147483647 | +9223372036854775807 |
- 最小値を下回る・最大値を超える計算や整数以外の数と演算を行った、つまり整数でデータを維持出来なくなったとき、次に紹介する 浮動小数点数 に自動的に変換されます。
var_dump(PHP_INT_MAX, PHP_INT_MAX + 1);
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}$
この考え方はまさに 浮動小数点数 そのものであるとも言えます。実際には 基数 である 10
は 2
に変換されて管理されていますが、考え方はほとんど同じです。 「有効数字$n$桁まで計算しなさい」 のような問題、ありましたよね。この有効数字部分のことを 仮数 と呼ぶのです。32ビットの仮数精度を持つタイプのものに float
、その倍の64ビットの仮数精度を持つタイプのものに double
という名前が付けられています。
PHPにおける浮動小数点数
- float と double は同じ意味ですが、前者の方がよく用いられます。
他のプログラミング言語と同じように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
- 一般的な表し方です。
var_dump(1.45, -1.0, 0.0);
float(1.45)
float(-1.0)
float(0.0)
- 科学記法を使った例です。
e
またはE
以降に基数10
を何乗するかを続けます。
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
になります。 NAN
とNAN
を比較しても結果はFALSE
になります。- ある値が
NAN
であるか調べるにはis_nan
関数を使う方法1つしかありません。
var_dump(asin(1.1)); // アークサインの定義域は-1から1の間
float(NAN)
無限大(INF, Infinite, ∞)
PHPで浮動小数点数が膨大、具体的には約 $1.8 × 10 ^{308}$ 以上の値になると、その数は 無限大 に変換されます。
- この値は定数
INF
によって定義されています。定数なので大文字小文字は区別されます。 - 一度
INF
になってしまったものをもとの数に戻すことは出来ません。 - マイナス無限大も存在します。
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 / 0
やINF / 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
// 私は一人ぼっちか?
$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
はリソースの種類を表しています。