Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】expm1()関数の使い方

expm1関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

expm1関数は、指定された数値xに対して「eのx乗から1を引いた値(e^x - 1)」を計算する関数です。この関数は、数学定数e(ネイピア数、約2.71828)を引数xの累乗(べき乗)として計算し、その結果から1を減算します。

特に、引数xが非常に小さい値、すなわち0に近い値である場合にこの関数の利点が発揮されます。一般的な計算方法であるexp(x) - 1を直接実行すると、xが0に近い場合、exp(x)の結果が1に極めて近くなります。この状況で1を引くと、浮動小数点数の精度限界により、計算結果に大きな誤差(桁落ち)が生じる可能性があります。

expm1関数は、このような計算誤差を回避し、xが0に近い場合でも高い精度でe^x - 1の値を計算するために特別に設計されています。このため、金融計算や科学技術計算など、微小な値の扱いが重要となる分野で役立ちます。

引数には計算対象となる数値を浮動小数点数(float)で指定します。戻り値も浮動小数点数(float)となり、正確に計算されたe^x - 1の結果が返されます。この関数はPHP 8以降で利用可能です。

構文(syntax)

1<?php
2$inputFloat = 0.0;
3$outputFloat = expm1($inputFloat);
4?>

引数(parameters)

float $num

  • float $num: $num は、e<sup>$num</sup> - 1 の値を計算するための浮動小数点数です。

戻り値(return)

float

eのx乗から1を引いた値(e^x - 1)を返します。この関数は、xが0に近い場合に、1 - exp(-x)よりも高い精度で計算できます。

サンプルコード

PHP expm1関数で精度の高い計算をする

1<?php
2
3/**
4 * PHPのexpm1関数の使用例を示します。
5 *
6 * expm1(x) は、数学的な e^x - 1 を計算します。
7 * 特に x の値が0に非常に近い場合に、exp(x) - 1 を直接計算するよりも高い精度で結果を提供します。
8 * これは、浮動小数点数の丸め誤差を避けるために重要です。
9 */
10function demonstrateExpm1Precision(): void
11{
12    // 0に非常に近い浮動小数点数を設定します。
13    // このような小さな値で exp(x) - 1 を計算すると、精度問題が発生しやすくなります。
14    $x = 1.0E-15; // 例: 0.000000000000001
15
16    echo "--- expm1() 関数のデモンストレーション ---" . PHP_EOL;
17    echo "対象の数値 x: " . sprintf('%.20f', $x) . PHP_EOL . PHP_EOL;
18
19    // expm1() を使用した計算
20    // x が 0 に近い場合でも、より正確な結果が得られます。
21    $resultExpm1 = expm1($x);
22    echo "expm1(x) の結果:     " . sprintf('%.20f', $resultExpm1) . PHP_EOL;
23
24    // exp() - 1 を使用した直接計算
25    // x が 0 に近いと exp(x) はほぼ 1 となり、1 - 1 の計算で有効桁数が失われる(キャンセルアウト)可能性があります。
26    $resultExpMinus1 = exp($x) - 1;
27    echo "exp(x) - 1 の結果:   " . sprintf('%.20f', $resultExpMinus1) . PHP_EOL;
28
29    // 両者の差を表示し、精度の違いを確認します。
30    $difference = abs($resultExpm1 - $resultExpMinus1);
31    echo "両者の絶対差:        " . sprintf('%.20f', $difference) . PHP_EOL . PHP_EOL;
32
33    echo "補足:" . PHP_EOL;
34    echo "x が 0 に近い場合、exp(x) は 1 に非常に近くなります。" . PHP_EOL;
35    echo "このとき、exp(x) - 1 を直接計算すると、浮動小数点数の精度限界により、" . PHP_EOL;
36    echo "ほとんど同じ値の引き算(例: 1.000000000000001 - 1.0)が行われ、" . PHP_EOL;
37    echo "有効な情報(特に小数点以下の細かい部分)が失われる『情報の露出不足』が生じます。" . PHP_EOL;
38    echo "expm1() 関数は、このような精度損失を避けて正確な結果を『露出させる』ために存在します。" . PHP_EOL;
39}
40
41// 関数を実行して結果を確認します。
42demonstrateExpm1Precision();

PHPのexpm1関数は、数学的なネイピア数ex乗から1を引いた値(e^x - 1)を計算する関数です。引数には浮動小数点数$numを指定し、戻り値も浮動小数点数となります。

この関数は、特に引数$num0に非常に近い場合に重要です。通常のexp($num) - 1という計算では、$num0に近いとexp($num)の結果が1に非常に近くなります。このとき、ほぼ同じ値同士の引き算が行われるため、浮動小数点数の精度限界により、計算結果の有効桁数が失われ、小数点以下の正確な情報が「情報の露出不足」となり、精度が低下する可能性があります。

expm1関数は、このような精度上の問題を内部的に解決し、$num0に非常に近い場合でも、より正確なe^x - 1の値を「露出させる」ことで提供します。システム開発において、微細な数値計算の精度が求められる場面で、信頼性の高い結果を得るために利用されます。

expm1関数は、数学的なe^x - 1を計算する際に使用されます。この関数の最も重要な注意点は、引数$numが0に非常に近い場合に、直接exp($num) - 1と計算するよりも高い精度で結果を提供することです。通常のexp($num) - 1という計算では、$numが0に近いとexp($num)がほぼ1となり、浮動小数点数の特性上、1 - 1のような引き算で有効桁数が失われる「桁落ち」と呼ばれる精度損失が発生しやすくなります。expm1関数は、このような精度損失を内部的に回避し、より正確な結果を返すように設計されています。数値計算において厳密な精度が求められる場面では、本関数を積極的に活用し、予期せぬ誤差を防ぐようにしましょう。引数と戻り値は共にfloat型です。

PHP expm1 関数で精度良く計算する

1<?php
2
3/**
4 * expm1関数の使用例
5 *
6 * expm1(x) は exp(x) - 1 を計算する関数です。
7 * 特にxが0に近い場合、exp(x) - 1 を直接計算するよりも高い精度を提供します。
8 * exp(x) はネイピア数e (約2.71828) のx乗を意味します。
9 */
10
11// 例1: 引数が0の場合
12// expm1(0) は exp(0) - 1 = 1 - 1 = 0 となります。
13$num1 = 0.0;
14$result1 = expm1($num1);
15echo "expm1($num1) の結果: $result1\n"; // 出力: expm1(0) の結果: 0
16
17// 例2: 引数が正の数の場合
18// expm1(1) は exp(1) - 1 ≈ 2.71828 - 1 ≈ 1.71828 となります。
19$num2 = 1.0;
20$result2 = expm1($num2);
21echo "expm1($num2) の結果: $result2\n"; // 出力例: expm1(1) の結果: 1.718281828459
22
23// 例3: 引数が0に近い小さな正の数の場合
24// このような場合、expm1はより高い精度を発揮します。
25$num3 = 0.00000001;
26$result3 = expm1($num3);
27echo "expm1($num3) の結果: $result3\n"; // 出力例: expm1(1.0E-8) の結果: 1.000000005E-8
28
29// 例4: 引数が負の数の場合
30// expm1(-1) は exp(-1) - 1 ≈ 0.36788 - 1 ≈ -0.63212 となります。
31$num4 = -1.0;
32$result4 = expm1($num4);
33echo "expm1($num4) の結果: $result4\n"; // 出力例: expm1(-1) の結果: -0.63212055882856
34
35?>

PHP 8に搭載されているexpm1関数は、数学におけるネイピア数e(約2.71828)の指定された数値乗から1を引いた値を計算します。具体的には、引数として渡された浮動小数点数$numに対してexp($num) - 1という計算を行います。この関数は、特に引数$numが0に近い非常に小さな数値の場合に、通常のexp($num) - 1と直接計算するよりも高い精度で結果を返せる点が特徴です。

引数$numには計算したい指数を浮動小数点数(float)で渡します。戻り値も計算結果である浮動小数点数(float)となります。例えば、expm1(0)0を返し、expm1(1)は約1.71828を返します。$numが正の値であれば正の数を、負の値であれば負の数を返します。科学技術計算や統計分析など、浮動小数点数の精度が重要となる場面で活用される関数です。

expm1関数は、exp(x) - 1を計算しますが、特に引数xが0に非常に近い場合に、直接exp(x) - 1を計算するよりも高い精度を提供します。浮動小数点数の計算では、値が0に近い場合に丸め誤差が生じやすいため、この関数はそのような状況でより正確な結果を得るために利用されます。引数には必ず浮動小数点数型の数値を指定する必要があり、戻り値も浮動小数点数となります。意図しない結果や精度の問題を避けるため、関数の特性と引数の型を理解して利用することが重要です。

関連コンテンツ

関連プログラミング言語