ASIN()関数の数学的原理は、-1と1の間の値のみを入力として受け入れることを決定します。入力値が-1未満または1を超える場合、PHPはNANを返し、エラーはトリガーされません。したがって、 asin()関数を呼び出す前に、入力パラメーターが有効であることを確認すると、入力値が法的範囲内であることを確認するために行われます。
<span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1.2</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$value</span></span><span> < -</span><span><span class="hljs-number">1</span></span><span> || </span><span><span class="hljs-variable">$value</span></span><span> > </span><span><span class="hljs-number">1</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"入力値は法的範囲外です!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">asin</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
}
</span></span>
この検証は、違法価値をASIN()関数に直接渡すことを避けることができます。
PHPの浮動小数点数は、特に浮動小数点数を比較して比較する場合、精度の問題の影響を受けることがあります。場合によっては、計算結果にわずかなエラーがある可能性があり、法的範囲内にある値が範囲外の値になり、 NANリターンを引き起こします。
たとえば、次のコードを検討してください。
<span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> + </span><span><span class="hljs-number">1e-15</span></span><span>; </span><span><span class="hljs-comment">// 浮動的な精度のため,おそらくそれ以上 1</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">asin</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
</span></span>
1 + 1E-15は法的価値のように見えますが、実際には浮遊精度の影響があるため有効な範囲を超えている可能性があり、 ASIN()がNANを返します。
この問題の解決策は、適切な精度範囲を設定するか、ラウンド()関数を使用してこの精度エラーを回避することです。
<span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-number">1</span></span><span> + </span><span><span class="hljs-number">1e-15</span></span><span>, </span><span><span class="hljs-number">15</span></span><span>); </span><span><span class="hljs-comment">// 精度が範囲を超えないようにします</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">asin</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
</span></span>
より複雑なプログラムでASIN()を使用してNANを返す場合、デバッグとロギングを通じて問題をさらにトラブルシューティングできます。毎回ASIN()関数に渡された入力値を記録することにより、エラーの根本原因をより簡単に追跡できます。
<span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1.2</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$value</span></span><span> < -</span><span><span class="hljs-number">1</span></span><span> || </span><span><span class="hljs-variable">$value</span></span><span> > </span><span><span class="hljs-number">1</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"asin 入力値は範囲外です: <span class="hljs-subst">$value</span></span></span><span>");
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">asin</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
}
</span></span>
ログは、特にユーザーの入力を処理したり、外部データソースからデータを受信したりする場合、入力の問題をすばやく見つけることができます。
ASIN()関数の入力値が外部データソース(データベース、API、ユーザー入力など)から来ている場合、これらのデータの正しさを確保する必要があります。場合によっては、外部データソースに無効な値が含まれている場合があり、 ASIN()関数がNANを返します。
たとえば、データベースからデータを取得する場合、計算が失敗する違法な値がある場合があります。
<span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT value FROM table WHERE id = 1"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$conn</span></span><span>, </span><span><span class="hljs-variable">$query</span></span><span>);
</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'value'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$value</span></span><span> < -</span><span><span class="hljs-number">1</span></span><span> || </span><span><span class="hljs-variable">$value</span></span><span> > </span><span><span class="hljs-number">1</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"データベースによって返される値は無効です: <span class="hljs-subst">$value</span></span></span><span>";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">asin</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
}
</span></span>
この時点で、外部入力を適切にチェックしていることを確認してください。これにより、 NANを返す問題を効果的に回避できます。
いくつかのより複雑なプログラムでは、入力値を直接チェックする代わりに、 NANリターン値をより優雅に処理することが望ましい場合があります。この場合、PHPの例外処理メカニズムを使用して、 NANリターンの状況をキャプチャして処理できます。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$value</span></span><span> = </span><span><span class="hljs-number">1.5</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">asin</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_nan</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>)) {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"計算結果は次のとおりです NaN,無効な入力値"</span></span><span>);
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Error: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>
例外処理により、 NANが発生したときにエラーをキャプチャして記録でき、プログラムの直接クラッシュを回避できます。
ASIN()関数を使用する場合、 NANを返す問題は通常、無効な入力値が渡されることによって引き起こされます。ここにいくつかのベストプラクティスがあります:
入力範囲を確認します。入力値が[-1、1]の間にあることを確認してください。
フローティングの精度の問題を処理します。ラウンド()またはその他のメソッドを使用して、フローティングポイントエラーを減らします。
ロギングとデバッグ:トラブルシューティングを容易にするために、入力値を記録します。
外部データソースの確認:データベースまたはAPIのデータの有効性チェックを実行します。
例外処理:トライキャッチ構造を使用して、エラーを優雅にキャッチして処理します。
これらの方法により、 NANを返すASIN()関数の問題を効果的に回避および解決し、プログラムの堅牢性と安定性を確保できます。