ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, fdiv, 浮動小数点の割り算をする関数の追加。'/' の式で十分じゃないか?

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

PHP8.0で、2つのfloat型数値を使った除算(割り算)をする関数が追加されました。fdiv()。

PHP7ですでに追加されているintdiv()の小数点版です。結果も浮動小数点で返されます。

でも使い道が思いつかない。'/' の式で十分だし。

fdiv() はパラメータで指定した2つのfloat型で除算(割り算)を行います。

fdiv(float $num1, float $num2): float

num1: 分子の値

num2: 分母の値

$num1 = 1;
$num2 = 4;

$val = fdiv($num1, $num2);

var_dump($val);
実行結果
float(0.25)

割り算なので分母に0は指定できません。エラーにはなりませんが、返される値が INF, -INF, NaN のいずれかになります。

(NaN は非数値の意味で数値としては無効値。INF, -INF はInfinity(無限大)のこと。)

PHP公式ドキュメント

定義済み定数 - INF, -INF, NaN

// 分子が正数で分母が0ならINFを返す
$num1 = 1;
$num2 = 0;
$val = fdiv($num1, $num2);
var_dump($val);

// 分子が負数で分母が0なら-INFを返す
$num1 = -1;
$num2 = 0;
$val = fdiv($num1, $num2);
var_dump($val);

// 分子が0で分母が0ならNaNを返す
$num1 = 0;
$num2 = 0;
$val = fdiv($num1, $num2);
var_dump($val);
実行結果
float(INF)
float(-INF)
float(NAN)

なんでこんな結果になるかといえば、fdiv() は浮動小数点の表現形式で広く一般的に使われている、 IEEE 754 に準拠して計算しているから。

'/' ではいけないの?

『割り算を関数を使ってやる必要ある?』と思う人がほとんどでしょう。プログラミングでは '/' を使えばかんたんに割り算の式ができるから。

'/' でダメということはありません。ただし、分母が0になる可能性は押さえときましょう。

除算の式で分母が0になったらエラー例外が発生します。

<?php

$num1 = 1;
$num2 = 0;
$val = $num1 / $num2;
var_dump($val);
実行結果
PHP Fatal error:  Uncaught DivisionByZeroError: Division by zero in /home/vagrant/php-test.php:5
Stack trace:
#0 {main}
  thrown in /home/vagrant/php-test.php on line 5

Devisionは除算(割り算)のこと。除算の分母で0を使われたら困るという内容。

'/' でもうひとつ気をつけることは、IEEE 754 に準拠しているか分からないこと。

一般的な業務計算レベルでは問題ないですが、計算の精度が必要になってくるとちょっと不安です。

fdiv() の追加は intdiv() の存在が関係している?

そういうことも考えて fdiv() を追加したんじゃないかな?

ただ、そんな高度な精度が必要ならC++やJava, Pythonを使うし、ゴリゴリの科学技術計算ならFortranとかを使います。

PHPで必要だろうか? 個人的には '/' で事足りると思う。

ちなみに、PHP7で intdiv() という、整数同士の除算を行う関数が追加されたんですが、結果もint型で整数であるために小数点以下は切り捨てられます。

$num1 = 1;
$num2 = 4;
$val = intdiv($num1, $num2);
var_dump($val);

$num1 = 10;
$num2 = 4;
$val = intdiv($num1, $num2);
var_dump($val);
int(0)
int(2)

fdiv() を追加した一番の理由はこれなんじゃないだろうか?

『そんな中途半端な intdiv() なんてものを追加するくらいなら、小数点以下に対応した関数を用意せーっ!』という声が出るだろうことはかんたんに想像できるし。

前の投稿
PHP8, 特定の文字列で始まる(終わる)文字列か?を判定する関数を2つ追加。正規表現はいらない。
PHP8, get_debug_type, 変数の型を文字列で返す関数。よりデバッグしやすい表示。
次の投稿

コメントを残す