ホームページ >バックエンド開発 >PHPチュートリアル >PHPデータ型の解析 浮動小数点型(Float)

PHPデータ型の解析 浮動小数点型(Float)

怪我咯
怪我咯オリジナル
2017-04-05 10:42:032549ブラウズ

浮動小数点型 (浮動小数点数 float、倍精度数値または実数 real とも呼ばれます) は、次の構文のいずれかで定義できます:

<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>

浮動小数点数は、次の形式で表現されます。の:

LNUM -9]+
DNUM ([0-9]*[.]{LNUM}) ({LNUM}[.][0-9]*)
EXPONENT_DNUM [ +-]?(({LNUM} | {DNUM }) [eE][+-]? {LNUM})

浮動小数点数の語長はプラットフォームに依存しますが、通常、最大値は 1.8e308 です。 14 桁の 10 進数の精度 (64 ビット IEEE 形式)。

警告

浮動小数点数の精度

浮動小数点数の精度には限界があります。システムにもよりますが、PHP は通常 IEEE 754 double 形式を使用するため、丸めによる最大相対誤差は 1.11e-16 です。非基本的な数学演算ではより大きな誤差が生じる可能性があるため、複合演算を実行する場合は誤差の伝播を考慮する必要があります。

また、10進数で正確に表現できる0.1や0.7などの有理数は、仮数部がいくらあっても、内部で使用するバイナリでは正確に表現できないため、多少の劣化をせずにバイナリ形式に変換することはできません。ちょっとした精度。これは、混乱を招く結果につながる可能性があります。たとえば、floor((0.1+0.7)*10) は、通常、結果の内部表現が実際には 7.9999999999999991118... のようなものであるため、期待される 8 ではなく 7 を返します。

したがって、浮動小数点数の結果が最後の桁まで正確であるとは決して信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較しないでください。本当に高い精度が必要な場合は、任意精度数学 関数 または gmp 関数を使用する必要があります。

簡単な説明については、「浮動小数点ガイド」Web ページを参照してください。

浮動小数点数への変換

文字列を浮動小数点数に変換する時期と方法についての情報が必要な場合は、「文字列を数値に変換する」セクションを参照してください。他のタイプの値の場合、状況は値を整数に変換してから浮動小数点に変換する場合と似ています。詳細については、「整数への変換」セクションを参照してください。 PHP 5 では、オブジェクトを浮動小数点数に変換しようとすると、E_NOTICE エラー メッセージが生成されます。

浮動小数点数の比較

上記の警告メッセージにあるように、内部式の理由により、2 つの浮動小数点数が等しいかどうかを比較する際に問題があります。ただし、浮動小数点値を比較する回りくどい方法があります。

浮動小数点数が等しいかどうかをテストするには、その値よりほんの少しだけ大きい最小誤差値を使用します。この値は、マシン最小値 (イプシロン) とも呼ばれ、最小単位は整数 であり、計算で受け入れられる最小の差の値です。

$a と $b は小数点以下 5 桁の精度に相当します。

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
   echo "true";
}
?>

NaN​​

特定の数学演算は、

定数 NAN で表される結果を生成します。この結果は、未定義または浮動小数点演算で表現できない値を表します。この値と他の値との緩い比較または厳密な比較の結果は FALSE になります。

NAN は異なる値を表すため、NAN はそれ自体を含む他の値と比較されるべきではなく、is_nan() を使用してチェックされる必要があります。

以上がPHPデータ型の解析 浮動小数点型(Float)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。