PHP 浮動小数点数について知っておくべきこと、PHP 浮動小数点数の知識_PHP チュートリアル
PHP 浮動小数点数の知識、PHP 浮動小数点数の知識を知っておく必要があります
PHP は、そのような機能では必然的に、数値を保存するために内部で zval を使用します。 zval の構造は次のとおりです (例として 5.2):
コードをコピーします コードは次のとおりです:
struct _zval_struct {
/* 変数情報 */
zvalue_value 値; /* 値 */
zend_uint refcount;
zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref;
};
上記の構造では、実際に値自体を保存するのは zvalue_value ユニオンです:
コードをコピーします コードは次のとおりです:
typedef Union _zvalue_value {
長い lval; /* 長い値 */
double dval; /* 倍精度の値 */
構造体{
char *val;
int len;
} str;
HashTable *ht; /* ハッシュ テーブルの値 */
zend_object_value obj;
zvalue_value;
今日のトピックでは、そのうちの 2 つ、lval と dval にのみ焦点を当てます。long lval はコンパイラと OS のワード長によって不定であることを認識しなければなりません。また、double dval (倍精度) が指定されています。 IEEE 754 によるもので、固定長であり、64 ビットである必要があります。
これにより、一部の PHP コードが「非プラットフォーム非依存」になるため、以下の説明では、特に指定がない限り、long が 64 ビットであることを前提としています。
ここでは IEEE 754 の浮動小数点カウント方法を引用しません。興味があれば、ご自身で確認してください。重要な点は、倍精度浮動小数点の仮数が 52 ビットで格納されることです。ビット、合計は 53 ビットです。ここで、非常に興味深い疑問が生じます。例として C コードを使用してみましょう (long が 64 ビットであると仮定します)。
コードをコピーします コードは次のとおりです:
長い a = x;
assert(a == (long)(double)a);
すみません、a の値がどの範囲内にある場合、上記のコードは成功すると言えますか? (答えは記事の最後に残しておきます)
それでは、本題に戻りましょう。PHP は、スクリプトを実行する前に、まずスクリプトを読み取り、スクリプトを分析する必要があります。たとえば、次のスクリプトの場合は、次のとおりです。
コードをコピーします
コードは次のとおりです:
$a = 9223372036854775807; //64ビット符号付き数値の最大値
$b = 9223372036854775808; //最大値+1
;
var_dump($a);
var_dump($b);
出力:
コードをコピーします
コードは次のとおりです:
int(9223372036854775807)
float(9.22337203685E+18)
つまり、字句解析フェーズ中に、PHP はリテラル値が現在のシステムの長いテーブル値の範囲を超えているかどうかを判断し、超えていない場合は lval を使用して保存し、そうでない場合は dval を使用します。使用されるのは、zval IS_FLOAT を意味します。
最大の整数値より大きい値を使用すると、精度が失われる可能性があるため、注意する必要があります。
コードをコピーします
コードは次のとおりです:
$a = 9223372036854775807;
$b = 9223372036854775808;
var_dump($a === ($b - 1));
出力は false です。
冒頭の議論の続きですが、前述したように、PHP の整数は 32 ビットまたは 64 ビットであるため、64 ビットで正常に実行できる一部のコードは、目に見えない型変換、精度の損失により失敗する可能性があると判断されています。が発生すると、コードが 32 ビット システムで適切に実行されなくなります。
コードは次のとおりです:
エコー PHP_INT_MAX;
?>
もちろん、安全を期すために、文字列を使用して大きな整数を保存し、bcmath などの数学関数ライブラリを使用して計算を実行する必要があります。
さらに、私たちを混乱させるもう 1 つの重要な設定があります。この設定は php.precision です。この設定は、PHP が float 値を出力するときに出力する有効桁数を決定します。
最後に、上で挙げた質問を振り返ってみましょう。つまり、float に変換してから long に戻すときに精度が失われないようにするための、long 整数の最大値はいくらですか?
たとえば、整数の場合、そのバイナリ表現は 101 であることがわかります。次に、2 ビットを右シフトして 1.01 にし、上位の暗黙的な有効ビット 1 を破棄して、バイナリ値 5 を取得します。二重に:
コードをコピーします コードは次のとおりです:
0/*符号ビット*/ 10000000001/*指数ビット*/ 010000000000000000000000000000000000000000000000000
5 のバイナリ表現は、損失なく仮数部に格納されます。この場合、double から long に変換するときに精度が失われることはありません。
コードをコピーします コードは次のとおりです:
2^53 - 1 == 9007199254740991; //ここでは 64 ビット長であると仮定していることに注意してください
そうすれば、long->double->long 値の変換が発生したときに、この整数の精度が失われることはありません。
http://www.bkjia.com/PHPjc/998815.html

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。
