PHP Manual
/
数学

PHPで数学

16. 02. 2020

Obsah článku

他の言語と同様、PHP の数値はバイナリシステム (1 と 0 の組み合わせ) で表されるので、いくつかの数学演算では期待した結果とは若干異なる結果が得られる可能性があります。このページでは、さまざまなコンテキストでの計算の動作の概要を説明します。理解するためには、少なくとも**数値計算技術**と**数系**の基礎知識が必要です。

メモリ上の数値の表現

数値の表現方法はデータ型によって特徴付けられ、例えば整数はソースコードから直接10進数から2進数に変換される。数字の変換を気にする必要はまったくなく、すべて自動で行われるのです。

この変換の結果、整数の最大値はメモリで利用可能なビット数で決定される。32 ビットの PHP では -2,147,483,648 から -2,147,483,647 (~ ± 20 億)、64 ビットの PHP では -9,223,372,036,854,775,808 から -9,223,372,036,854,775,807 (~ ± 9 quintillion) までが範囲である。最大値は、定数 PHP_INT_MAX をコールすることで常に取得することができる。

10進数は float データ型に格納されるが,このデータ型は精度に限界があるため,内部的には mantissa * (2^exponent) という数学演算を受ける数値の組として格納される.その結果、少ないビット数で比較的大きな数(数十億のオーダー)を記憶することができるようになったのだが、ただあまり正確ではない。

データ型として float を使用した結果、1 - 0.9 の計算結果が正確に 0.1 にならないことがあります。

ウェブフォーラムからの例です。

$x = 0.3;
$y = 0.4;
echo 0.7 - $x - $y; // prints -5.5511151231258E-17

数字を少し調整すると

$x = 6.5;
$y = 7.5;
echo 14.0 - $x - $y; // 0を表示する

一般に、この問題については、VTM.e15.cz: Why computers have problems with decimal の別の記事で議論されていますし、Wikipedia の浮動小数点についても一般に議論されています。

一般的には、計算後に結果を丸めるか、小数を完全に避けるのがよいでしょう。例えば、価格をクラウン(14.90のような)ではなく、ペニー(1490のような)で保存し、それを正確に操作することです。丸め方については、次の項目で説明します。

数学の演算

$a = 5;
$b = 3;
echo $a + $b;

演算には、数学のルールに従って演算子の優先順位を尊重する、一般的な数学的慣習を用いることができます(乗算は加算に優先する、など)。値は直接書き込むことも、変数を介して読み込むこともできる。

一見するとわからないかもしれませんが、数学の例では、等号(=)は書かれていません。したがって、単純な「二項演算」しか解くことができず、それは常に「2つの要素」だけで動作します(方程式を数えてはいけません、そのためには専用のライブラリを使用する必要があります)。

基本演算子の概要

result の欄には、何を想定してプリントされているのかを列挙しています。

$a = 5;
$b = 3;
$c = 10;

操作方法|マーク|表記例|結果
加算|+|プラス|echo $a + $b;|8
引き算| -| マイナス| echo $a - $b;| 2
乗算|*|アスタリスク|echo $a * $b;|15
分割|/|スラッシュ|echo $a / $b;|1.666666667
括弧|( )|括弧|echo $a + ($b * $c);
文字列の連結|.|ピリオド|echo $a . $b . $c;|5310
分割後の余り|%|パーセント|echo $a % $b;`|2
1つのプラスを加える
1を引く
パワー|***|アスタリスク2つ|echo $a ** $b;`|125

power 演算子 (ダブルアスタリスク) は PHP 7.1 以降で利用可能です。 その他のバージョンの PHP では、汎用関数 pow($a, $b) を使用する必要があります。

数学の基本関数の概要

一般的な計算タスクを解決する場合、ほとんどの場合、すでにPHPに直接関数が存在します。

丸め

通常の丸めはround()関数で行い、3つのパラメータを持っています。

  • 丸められた数字
  • 任意:精度(小数点以下何桁までか)
  • 任意:半減値(どの値から切り上げるか)

round(5); // 5
round(5.1); // 5
round(5.4); // 5
round(5.5); // 6
round(5.8); // 6
round(5483.47621, 2); // 5483.47
round(5483.47621, -2); // 5500

また、切り捨てのためのfloor() 関数と切り上げのためのceil() 関数がある。

**Watch out for data types!

すべての丸め関数は、結果が整数であっても、結果を float として返します。

結果を整数値として扱いたい場合は、結果をオーバータイプすることが重要です。例:echo (int) round(3.14);.

PHP はさまざまなデータ型を扱います。たとえば float の場合、 round() の結果が有限の小数展開を持つ数でないことは容易に起こりえます。出力には、後述する number_format() 関数を使用することをお勧めします。

ゴニオメトリック機能

これらは、さまざまな計算に使われ、単位円に基づいています。例えば、円、楕円、変位などの作図に使用される。

  • sin()のようになります。
  • cos()のようになります。
  • tan()のように。

サイクロメトリック機能

xy` の間の角度を計算しなさい。直交座標と極座標の変換。

双曲線関数

単位双曲線に基づく。その定義は、比喩を使って簡単に説明することができます。

  • 楕円、円、半径 1 の円
  • 双曲線、等軸双曲線、単位双曲線

例えば、地形生成や物理シミュレーションに利用されています。

ハイパーボロメトリック関数

単位双曲線に基づく。

ゴニオメトリック関数の使用例

echo sin(30); // -0.98803162409286
echo sin(deg2rad(30)); // 0.5
echo cos(deg2rad(123)); // -0.54463903501503
echo 1/tan(deg2rad(45)); // 1(オネン・コタンジェント)
echo sin(deg2rad(500)); // 0.64278760968654
echo atan2(deg2rad(50), deg2rad(23)); // 1.1396575860761

電卓 - 数式処理

5+2^(1+3/2)` のような数式をユーザ文字列として処理する必要がある場合があります。

このような入力をPHPで簡単に処理する方法はありませんが、私はこの問題に対処する一連のライブラリをプログラミングしています。

詳しくは別記事Calculator in PHP: 数式を文字列として処理するを参照してください。

大きな数字を扱う操作と計算の正確さ

大きな数字や小数は、PHPではfloatとして保存されます。さらに、小数点以下15桁程度に丸められますが、これは時に煩わしいことです。そこで、BCMath Arbitrary Precision Mathematics libraryが作られました

このライブラリでは数値は文字列で表現されるので、floatの不正確さに制限されないが、実行される演算は数桁遅くなる(それでもこのような関数を自分でプログラミングした場合よりは速い)。

例えば、小数点以下2桁から3桁までの平方根を求めたい場合は、次のように呼び出すだけである。

echo bcsqrt('2', 3); // 1.414

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
2.
Status:
All systems normal.
2024