検索
ホームページバックエンド開発PHPチュートリアル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 で定義されています。

コードをコピーします


コードは次のとおりです: エコー PHP_INT_MAX; ?>
もちろん、安全を期すために、文字列を使用して大きな整数を保存し、bcmath などの数学関数ライブラリを使用して計算を実行する必要があります。

さらに、私たちを混乱させるもう 1 つの重要な設定があります。この設定は php.precision です。この設定は、PHP が float 値を出力するときに出力する有効桁数を決定します。
最後に、上で挙げた質問を振り返ってみましょう。つまり、float に変換してから long に戻すときに精度が失われないようにするための、long 整数の最大値はいくらですか?

たとえば、整数の場合、そのバイナリ表現は 101 であることがわかります。次に、2 ビットを右シフトして 1.01 にし、上位の暗黙的な有効ビット 1 を破棄して、バイナリ値 5 を取得します。二重に:
コードをコピーします コードは次のとおりです:
0/*符号ビット*/ 10000000001/*指数ビット*/ 010000000000000000000000000000000000000000000000000

5 のバイナリ表現は、損失なく仮数部に格納されます。この場合、double から long に変換するときに精度が失われることはありません。

double は仮数を表すために 52 ビットを使用することがわかっています。暗黙の最初の 1 を数えると、合計は 53 ビットの精度になります。したがって、long 整数の値が次の値より小さい場合、次のように結論付けることができます。


コードをコピーします コードは次のとおりです: 2^53 - 1 == 9007199254740991; //ここでは 64 ビット長であると仮定していることに注意してください
そうすれば、long->double->long 値の変換が発生したときに、この整数の精度が失われることはありません。

http://www.bkjia.com/PHPjc/998815.html

tru​​ehttp://www.bkjia.com/PHPjc/998815.html技術記事 PHP 浮動小数点数の知識を知っておく必要があります。PHP は弱い型指定言語です。PHP は必然的に、内部で zval を使用してデータを保存します。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPセッションを使用することの制限は何ですか?PHPセッションを使用することの制限は何ですか?Apr 30, 2025 am 12:04 AM

phpsessionshaveverallimitations:1)storagecconstraintscanleadtoperformanceissues; 2)securityvulnerablesliasitylikessessionfixationAttacksicexist;

負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。負荷分散がセッション管理にどのように影響し、それに対処するかを説明します。Apr 29, 2025 am 12:42 AM

負荷分散はセッション管理に影響しますが、セッションの複製、セッションの粘着性、集中セッションストレージで解決できます。 1。セッションレプリケーションサーバー間のセッションデータをコピーします。 2。セッションスティンネスは、ユーザーリクエストを同じサーバーに指示します。 3.集中セッションストレージは、Redisなどの独立したサーバーを使用してセッションデータを保存してデータ共有を確保します。

セッションロックの概念を説明します。セッションロックの概念を説明します。Apr 29, 2025 am 12:39 AM

SESSIONLOCKINGISATECHNIQUESTOESUREAUSER'SSESSIONREMAINSEXCLUSIVETOONEUSATIME.ITISCRUCIALFORPREVENTINGDATACORTIONANDSECURITYBREACHESINMULTI-USERAPPLICATIONS.SESSIONLOCKINGISISIMPLEMENTEDUSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGROCKINGSMECHANISMなど

PHPセッションの選択肢はありますか?PHPセッションの選択肢はありますか?Apr 29, 2025 am 12:36 AM

PHPセッションの代替品には、Cookie、トークンベースの認証、データベースベースのセッション、Redis/Memcachedが含まれます。 1.Cookiesは、クライアントにデータを保存することによりセッションを管理します。 2.トークンベースの認証はトークンを使用してユーザーを検証します。これは非常に安全ですが、追加のロジックが必要です。 3.Databaseベースのセッションは、データベースにデータを保存します。これは、スケーラビリティが良好ですが、パフォーマンスに影響を与える可能性があります。 4. Redis/Memcachedは分散キャッシュを使用してパフォーマンスとスケーラビリティを向上させますが、追加のマッチングが必要です

PHPのコンテキストで「セッションハイジャック」という用語を定義します。PHPのコンテキストで「セッションハイジャック」という用語を定義します。Apr 29, 2025 am 12:33 AM

SessionHijackingとは、ユーザーのSessionIDを取得してユーザーになりすましている攻撃者を指します。予防方法には、次のものが含まれます。1)HTTPSを使用した通信の暗号化。 2)SessionIDのソースの検証。 3)安全なSessionID生成アルゴリズムの使用。 4)SessionIDを定期的に更新します。

PHPの完全な形式は何ですか?PHPの完全な形式は何ですか?Apr 28, 2025 pm 04:58 PM

この記事では、PHPについて説明し、その完全なフォーム、Web開発での主要な使用、PythonとJavaとの比較、および初心者の学習のしやすさについて説明します。

PHPはフォームデータをどのように処理しますか?PHPはフォームデータをどのように処理しますか?Apr 28, 2025 pm 04:57 PM

PHPは、$ \ _ postおよび$ \ _を使用してフォームデータを処理し、検証、消毒、安全なデータベースインタラクションを通じてセキュリティを確保します。

PHPとASP.NETの違いは何ですか?PHPとASP.NETの違いは何ですか?Apr 28, 2025 pm 04:56 PM

この記事では、PHPとASP.NETを比較して、大規模なWebアプリケーション、パフォーマンスの違い、セキュリティ機能への適合性に焦点を当てています。どちらも大規模なプロジェクトでは実行可能ですが、PHPはオープンソースであり、プラットフォームに依存しませんが、ASP.NET、

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。