【PHP8.x】tan()関数の使い方
tan関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
tan関数は、指定された数値のタンジェント(正接)を計算する関数です。この関数は、引数としてラジアン単位の角度を浮動小数点数(float)で受け取り、その角度のタンジェント値を浮動小数点数で返します。タンジェントは、数学における基本的な三角関数の一つであり、直角三角形において、一つの鋭角の対辺の長さを隣辺の長さで割った比率として定義されます。
例えば、π/4ラジアン(これは45度に相当します)のタンジェントは1.0となります。PHPでは、円周率を定数 M_PI で利用できますので、tan(M_PI / 4) と記述することで、この計算を実行できます。もし、度数法で角度が与えられている場合は、deg2rad() 関数を使用して度数をラジアンに変換してから tan() 関数に渡す必要があります。例えば、tan(deg2rad(45)) とすることで、45度のタンジェントを計算できます。
この関数は、幾何学的な計算、グラフ描画、物理シミュレーションなど、角度と比率を扱う様々な場面で利用され、正確な三角関数計算を効率的に行うことができます。
構文(syntax)
1<?php 2echo tan(M_PI_4); 3?>
引数(parameters)
float $num
PHP:
- float $num: 角度(ラジアン)を指定する浮動小数点数
戻り値(return)
float
引数で与えられた数値のタンジェント(正接)を浮動小数点数(float)で返します。
サンプルコード
PHP tan() 関数の単体テストを実行する
1<?php 2 3/** 4 * 浮動小数点数の比較に用いる許容誤差。 5 * 浮動小数点数は正確な値を表現できない場合があるため、直接等号(==)で比較せず、 6 * 差がこの値より小さいかどうかで「ほぼ等しい」と判断します。 7 */ 8const EPSILON = 0.000001; 9 10/** 11 * PHPのtan()関数のシンプルな単体テストを実行します。 12 * 13 * この関数は、既知の入力値と期待される出力値のペアを用いて、 14 * tan()関数の動作が正しいかを検証します。 15 * 浮動小数点数の比較には、EPSILON定数で定義された許容誤差を使用します。 16 */ 17function runSimpleTanTests(): void 18{ 19 echo "--- tan() 関数の単体テスト開始 ---\n"; 20 21 // テストケースの定義: [入力値 (ラジアン) => 期待される出力値] 22 // PHPのtan()はラジアン単位の角度を引数に取ります。 23 $testCases = [ 24 0.0 => 0.0, // tan(0) = 0 25 M_PI_4 => 1.0, // tan(π/4 ラジアン、つまり45度) = 1 26 -M_PI_4 => -1.0, // tan(-π/4 ラジアン、つまり-45度) = -1 27 // M_PI_4 は PHP の組み込み定数で、pi()/4 の値です。 28 // 注意: tan(M_PI_2) のように90度(π/2ラジアン)は無限大に発散するため、 29 // 浮動小数点数のテストとしては不適切です。 30 ]; 31 32 $passedCount = 0; 33 $totalCount = 0; 34 35 foreach ($testCases as $input => $expected) { 36 $totalCount++; 37 $actual = tan($input); // tan()関数を呼び出し、実際の結果を取得 38 39 // 浮動小数点数を比較する際は、直接 == を使わず、差が許容誤差内かを確認します。 40 if (abs($actual - $expected) < EPSILON) { 41 echo "テスト {$totalCount}: tan({$input}) = 期待値 {$expected}, 実際値 {$actual} - [成功]\n"; 42 $passedCount++; 43 } else { 44 echo "テスト {$totalCount}: tan({$input}) = 期待値 {$expected}, 実際値 {$actual} - [失敗] (差: " . abs($actual - $expected) . ")\n"; 45 } 46 } 47 48 echo "--- テスト結果 ---\n"; 49 echo "成功: {$passedCount} / {$totalCount}\n"; 50 echo "失敗: " . ($totalCount - $passedCount) . " / {$totalCount}\n"; 51 echo "--- tan() 関数の単体テスト終了 ---\n"; 52} 53 54// テスト関数を実行します。 55runSimpleTanTests(); 56
PHPのtan関数は、引数として与えられた浮動小数点数(ラジアン単位の角度)の正接(タンジェント)を計算し、その結果を浮動小数点数で返す組み込み関数です。
このサンプルコードは、tan関数の基本的な動作を検証するための単体テストを示しています。コードではまず、EPSILON定数で浮動小数点数比較のための許容誤差を定義しています。これは、浮動小数点数が内部で厳密な値を表現できない場合があるため、直接==で比較する代わりに、差がこの誤差範囲内であるかを判定する一般的な手法です。
runSimpleTanTests関数内では、0.0やM_PI_4(約0.785ラジアン、45度)など、既知の入力値と期待されるtan関数の出力値をペアとして定義しています。それぞれの入力値に対してtan関数を呼び出し、得られた実際の結果と期待値との差がEPSILONよりも小さい場合にテストを「成功」と判定しています。このように、単体テストを通じて関数の正しい挙動を確認し、浮動小数点数を扱う際の注意点も学べます。
このサンプルコードは、PHPのtan()関数が引数をラジアン単位で受け取る点、そして浮動小数点数の比較における注意点を学ぶ上で重要です。浮動小数点数は内部的に誤差を含むため、直接==で比較せず、EPSILONで定義された許容誤差内で「ほぼ等しい」と判断する手法を常に活用してください。また、tan(π/2)のように結果が無限大に発散するケースは、浮動小数点数では正確に扱えないため、テスト対象から適切に除外する必要があります。単体テストは、関数の正しい動作確認や、予期せぬ挙動を早期に発見するために非常に役立ちます。
PHPで度数からタンジェントを計算する
1<?php 2 3/** 4 * 指定された度数のタンジェント(正接)を計算します。 5 * PHPのtan関数はラジアン単位の角度を期待するため、 6 * 度数をラジアンに変換してから計算を行います。 7 * 8 * @param float $degrees 計算したい角度(度数単位、例: 45.0) 9 * @return float 指定された角度のタンジェント値 10 */ 11function calculateTangentFromDegrees(float $degrees): float 12{ 13 // 度数をラジアンに変換します。 14 // PHPのtan関数は引数としてラジアン単位の角度を必要とします。 15 // deg2rad()関数は度数(degrees)をラジアン(radians)に変換します。 16 $radians = deg2rad($degrees); 17 18 // tan関数を使ってタンジェントを計算します。 19 $tangentValue = tan($radians); 20 21 return $tangentValue; 22} 23 24// --- 使用例 --- 25 26// 例1: 45度のタンジェントを計算 27// tan(45度) は 1 になります。 28$degrees1 = 45.0; 29$result1 = calculateTangentFromDegrees($degrees1); 30echo "{$degrees1}度のタンジェント: " . $result1 . PHP_EOL; 31 32// 例2: 0度のタンジェントを計算 33// tan(0度) は 0 になります。 34$degrees2 = 0.0; 35$result2 = calculateTangentFromDegrees($degrees2); 36echo "{$degrees2}度のタンジェント: " . $result2 . PHP_EOL; 37 38// 例3: 30度のタンジェントを計算 39$degrees3 = 30.0; 40$result3 = calculateTangentFromDegrees($degrees3); 41echo "{$degrees3}度のタンジェント: " . $result3 . PHP_EOL; 42 43// 例4: 90度のタンジェントを計算 (数学的には定義されませんが、非常に大きな値になります) 44$degrees4 = 90.0; 45$result4 = calculateTangentFromDegrees($degrees4); 46echo "{$degrees4}度のタンジェント: " . $result4 . PHP_EOL; 47 48// 補足: 直接ラジアンをtan関数に渡す場合 49// M_PI_4 は円周率πを4で割った値で、45度ラジアンに相当します。 50$radiansDirect = M_PI_4; // 45度 51$tangentDirect = tan($radiansDirect); 52echo "円周率π/4 ラジアン (45度) のタンジェント: " . $tangentDirect . PHP_EOL;
PHPのtan関数は、指定された角度のタンジェント(正接)を計算する際に使用されます。この関数は主に数学的な計算や、幾何学、物理学に関連するプログラミングで活用されます。
tan関数の引数 $num は、ラジアン単位の角度を指定する必要があります。引数と戻り値の型はどちらもfloat(浮動小数点数)です。もし度数(例: 45度)で角度を扱いたい場合は、直接tan関数に渡すのではなく、PHPが提供するdeg2rad()関数を使って度数をラジアンに変換してからtan関数に渡す必要があります。これにより、正確なタンジェント値を得ることができます。
提供されたサンプルコードでは、calculateTangentFromDegreesという関数を定義し、度数単位の角度を引数として受け取り、内部でdeg2rad()関数を用いてラジアンに変換後、tan関数でタンジェントを計算してその値を返しています。例えば、45度のタンジェントは1に、0度のタンジェントは0になります。90度のように数学的にタンジェントが定義されない(無限大に近づく)場合、PHPは非常に大きな浮動小数点数を返します。また、M_PI_4(円周率π/4、つまり45度ラジアン)のようなラジアン単位の定数を直接tan関数に渡すことも可能です。
PHPのtan関数は、引数としてラジアン単位の角度を期待します。一般的に使われる度数(degrees)でタンジェントを計算したい場合は、deg2rad()関数を使って度数をラジアンに変換してからtan関数に渡してください。この単位変換を忘れると、計算結果が全く異なる値となるため注意が必要です。また、数学的にタンジェントが定義されない90度や270度などの角度を計算すると、PHPでは非常に大きな浮動小数点数が結果として返されます。これは数学的な無限大を表す近似値として扱われることを理解しておくことが重要です。直接ラジアン値を渡す場合は、円周率定数M_PIなどを活用することもできます。
PHPで単価を計算する
1<?php 2 3/** 4 * 品目の単価を計算し、複雑度に応じた調整を加えます。 5 * 6 * この関数は、「複雑度を表す角度」(例:設計の複雑さ)が、 7 * 追加費用に非線形にどのように影響するかをモデル化します。 8 * `tan` 関数は複雑度乗数を導き出すために使用され、 9 * 複雑度を表す角度が上限に近づくにつれて、乗数がより急速に増加します。 10 * 11 * @param float $basePrice 品目の基本単価。 12 * @param float $complexityAngleRadians 複雑度をラジアン単位の角度で表したもの。 13 * 0(追加複雑度なし)からM_PI_2(無限大に近づく乗数)の少し手前までを指定します。 14 * 実用上はM_PI / 3(約60度)までの値が一般的です。 15 * @return float 複雑度調整後の計算された単価。 16 */ 17function calculateAdjustedUnitPrice(float $basePrice, float $complexityAngleRadians): float 18{ 19 // tan関数が非常に大きな値にならないように、複雑度を表す角度の実用的な上限を定義します。 20 // M_PI / 2 (90度) ではtanは未定義となるため、その手前で制限します。 21 $maxPracticalAngle = M_PI / 3; // 例として60度に制限 (tan(60)は約1.73) 22 23 // 入力角度を実用的な範囲にクランプします。 24 // これにより、極端な角度による予期せぬ結果を防ぎ、堅牢性が向上します。 25 $clampedAngle = max(0.0, min($complexityAngleRadians, $maxPracticalAngle)); 26 27 // tan関数を使用して複雑度乗数を計算します。 28 // 角度が0からmaxPracticalAngleまで増加するにつれて、乗数は非線形に増加します。 29 $complexityMultiplier = tan($clampedAngle); 30 31 // 複雑度乗数1単位あたりの追加コストを定義します。 32 $costPerComplexityUnit = 25.0; // 例:乗数1単位あたり$25が単価に追加されます。 33 34 // 複雑度による追加コストを計算します。 35 $additionalComplexityCost = $complexityMultiplier * $costPerComplexityUnit; 36 37 // 最終的な単価は、基本単価に追加複雑度コストを加えたものです。 38 return $basePrice + $additionalComplexityCost; 39} 40 41// --- 単体で動作可能なサンプルコードの使用例 --- 42// この部分は、関数が単体で動作することを示すために含めます。 43// 実際の利用時には通常、より大きなシステムの一部となります。 44 45$baseItemPrice = 500.0; // 品目の基本単価 46 47// 複雑度なしの単価を計算 (角度0ラジアン) 48$unitPriceWithoutComplexity = calculateAdjustedUnitPrice($baseItemPrice, 0.0); 49 50// 中程度の複雑度(45度 = M_PI/4ラジアン)の単価を計算 51$unitPriceWithModerateComplexity = calculateAdjustedUnitPrice($baseItemPrice, M_PI / 4); 52 53// 高い複雑度(60度 = M_PI/3ラジアン)の単価を計算 54$unitPriceWithHighComplexity = calculateAdjustedUnitPrice($baseItemPrice, M_PI / 3); 55 56// これらの計算結果は変数に格納されますが、このコードブロックでは出力は行いません。
PHPのtan関数は、引数として渡された浮動小数点数(ラジアン単位の角度)のタンジェント(正接)を計算し、結果を浮動小数点数で返します。このサンプルコードでは、tan関数を品目の単価計算に応用しています。具体的には、製品やサービスの「複雑度」を角度として表現し、その複雑度に応じて単価を非線形に調整する目的で利用されています。
関数calculateAdjustedUnitPriceは、品目の基本単価を示す$basePriceと、複雑度をラジアン単位の角度で示す$complexityAngleRadiansの二つの引数を受け取ります。tan関数はここで、複雑度を表す角度が大きくなるにつれて、単価に追加されるコスト(乗数)がより急速に増加するように作用します。これにより、複雑度が増すほど単価への影響が大きくなる仕組みを実現しています。
引数$complexityAngleRadiansは、0(追加複雑度なし)から実用的な上限(例:M_PI / 3、約60度)までが想定されており、tan関数が極端に大きな値を返さないように角度が制限されています。最終的な戻り値は、基本単価に複雑度による追加コストを加算した、調整後の計算された単価となります。このアプローチは、設計の複雑さなどがコストに与える影響を数学的にモデル化する際に役立ちます。
PHPのtan関数は引数に角度をラジアン単位で指定します。度数で与えることは間違いやすい点なので注意が必要です。特に、角度が90度(M_PI_2ラジアン)に近づくと値が無限大に発散し未定義となる特性があります。サンプルコードのように、計算結果が暴走しないよう実用的な上限角度を設定し、入力値をクランプして利用することが非常に重要です。これにより、予期せぬ大きな値やエラーを防ぎ、システムの安定性を保てます。数学関数をビジネスロジックに適用する際は、その関数の特性を理解し、適切に利用するよう心がけましょう。円周率にはM_PI定数を使うと便利です。
PHPで安全にタンジェントを計算する
1<?php 2 3/** 4 * 指定された角度のタンジェントを安全に計算します。 5 * 角度がnullでない、かつ有限数である場合にのみ計算を実行します。 6 * PHPの短絡評価 (Short-circuit evaluation) を利用して、条件に応じて計算をスキップします。 7 * 8 * @param float|null $angleInRadians ラジアン単位の角度。nullまたは無限大・非数の場合、計算はスキップされます。 9 * @return float|null 計算結果(タンジェント)または計算がスキップされた場合はnullを返します。 10 */ 11function calculateTangentSafely(?float $angleInRadians): ?float 12{ 13 // 短絡評価 (Short-circuit evaluation) の例: 14 // 論理AND演算子 (&&) は、左側のオペランドがfalseと評価された場合、 15 // 右側のオペランド(is_finite() 関数の呼び出し)は評価しません。 16 // ここでは、$angleInRadiansがnullの場合、is_finite()は呼び出されずにif文全体がfalseとなります。 17 if ($angleInRadians !== null && is_finite($angleInRadians)) { 18 echo "角度 " . $angleInRadians . " のタンジェントを計算中...\n"; 19 // PHPの組み込み関数 tan() を使用してタンジェントを計算 20 $result = tan($angleInRadians); 21 return $result; 22 } 23 24 echo "角度がnullであるか、または有限数ではないため、タンジェントの計算をスキップします。\n"; 25 return null; 26} 27 28// --- 使用例 --- 29 30// 1. 有効な角度の場合 (短絡評価は発生せず、両方の条件が評価されtan()が実行される) 31echo "--- 例1: 有効な角度 (M_PI/4) ---\n"; 32$angle1 = M_PI / 4; // 約0.785ラジアン (45度) 33$tangent1 = calculateTangentSafely($angle1); 34if ($tangent1 !== null) { 35 echo "タンジェント: " . $tangent1 . "\n"; // 出力: タンジェント: 1 36} else { 37 echo "計算できませんでした。\n"; 38} 39echo "\n"; 40 41// 2. nullの角度の場合 (短絡評価が発生し、is_finite() は評価されない) 42echo "--- 例2: nullの角度 ---\n"; 43$angle2 = null; 44$tangent2 = calculateTangentSafely($angle2); 45if ($tangent2 !== null) { 46 echo "タンジェント: " . $tangent2 . "\n"; 47} else { 48 echo "計算できませんでした。\n"; // 出力: 計算できませんでした。 49} 50echo "\n"; 51 52// 3. 無限大の角度の場合 (最初の条件はtrueだが、is_finite() がfalseとなりtan()は実行されない) 53echo "--- 例3: 無限大の角度 (INF) ---\n"; 54$angle3 = INF; 55$tangent3 = calculateTangentSafely($angle3); 56if ($tangent3 !== null) { 57 echo "タンジェント: " . $tangent3 . "\n"; 58} else { 59 echo "計算できませんでした。\n"; // 出力: 計算できませんでした。 60} 61echo "\n"; 62 63// 4. 0の角度の場合 (有効なケース) 64echo "--- 例4: 0の角度 ---\n"; 65$angle4 = 0.0; 66$tangent4 = calculateTangentSafely($angle4); 67if ($tangent4 !== null) { 68 echo "タンジェント: " . $tangent4 . "\n"; // 出力: タンジェント: 0 69} else { 70 echo "計算できませんでした。\n"; 71} 72?>
このPHPコードは、与えられた角度のタンジェントを計算するtan()関数を使用していますが、計算を安全に行うための工夫が凝らされています。PHPの組み込み関数であるtan()は、ラジアン単位の浮動小数点数(float)を引数として受け取り、その角度のタンジェント値も浮動小数点数で返します。
サンプルコードのcalculateTangentSafely関数は、引数としてfloat型またはnullを受け取ることができます。この関数は、短絡評価という仕組みを利用して、tan()関数を呼び出す前に引数の妥当性をチェックします。短絡評価とは、論理AND演算子&&において、左側の条件がfalseと評価された場合、右側の条件は評価されないというPHPの機能です。
具体的には、if ($angleInRadians !== null && is_finite($angleInRadians))という条件式において、もし$angleInRadiansがnullであった場合、左側の条件式がfalseとなるため、右側のis_finite()関数は実行されません。これにより、nullに対して関数を呼び出すことによる潜在的なエラーを防ぎ、効率的な処理を実現しています。
この関数は、引数がnullでなく、かつ無限大や非数ではない有限な浮動小数点数である場合にのみ、tan()関数でタンジェントを計算し、その結果をfloatとして返します。それ以外の、nullや無限大、非数といった値が与えられた場合には計算をスキップし、nullを戻り値として返します。このようにすることで、呼び出し元は安全に計算結果を利用したり、計算ができなかったことを判断したりすることが可能となります。
このコードは、PHPの短絡評価を活用し、安全にタンジェントを計算します。論理AND演算子(&&)は、左側の条件が偽であれば右側の評価をスキップするため、null値に対してis_finite()を呼び出すようなエラーを未然に防ぐ重要なテクニックです。また、引数や戻り値に?floatを使用することで、nullを許容する型であることを明確にし、関数の利用者が予期せぬ値で混乱するのを防ぎます。tan関数はラジアン単位の角度を期待するため、度数法で扱う場合はラジアンへの変換が必要です。入力値の適切な検証は、プログラムの安定性を高める上で不可欠です。