


What you should know about PHP floating point numbers, PHP floating point number knowledge_PHP tutorial
You should know PHP floating point number knowledge, PHP floating point number knowledge
PHP is a weakly typed language. Such features inevitably require seamless and transparent implicit type conversion , PHP uses zval internally to save any type of value. The structure of zval is as follows (5.2 as an example):
Copy code The code is as follows:
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount;
zend_uchar type; /* active type */
zend_uchar is_ref;
};
In the above structure, what actually saves the value itself is the zvalue_value union:
Copy code The code is as follows:
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
Today’s topic, we only focus on two of them, lval and dval. We must realize that long lval has an uncertain length depending on the compiler and OS word length. It may be 32bits or 64bits, and double dval (double precision) is specified by IEEE 754 and is of fixed length, which must be 64bits.
Please keep this in mind, which makes some PHP code "non-platform independent". Our following discussion, unless otherwise specified, assumes that long is 64bits
I won’t quote the floating point counting method of IEEE 754 here. If you are interested, you can check it out for yourself. The key point is that the mantissa of double is stored in 52 bits, including the hidden 1 significant bit. A total of 53 bits.
Here, a very interesting question arises. Let’s use c code as an example (assuming long is 64bits):
Copy code The code is as follows:
long a = x;
assert(a == (long)(double)a);
Excuse me, when the value of a is within what range, can the above code be asserted to be successful? (Leave the answer at the end of the article)
Now let’s get back to the topic. Before executing a script, PHP first needs to read the script and analyze the script. This process also includes zvalizing the literals in the script. For example, for the following script:
Copy code The code is as follows:
$a = 9223372036854775807; //Maximum value of 64-bit signed number
$b = 9223372036854775808; //Maximum value 1
var_dump($a);
var_dump($b);
Output:
Copy code The code is as follows:
int(9223372036854775807)
float(9.22337203685E 18)
In other words, during the lexical analysis stage, PHP will judge whether a literal value exceeds the long table value range of the current system. If not, lval will be used to save it, and zval will be IS_LONG. Otherwise, dval will be used. means, zval IS_FLOAT.
We must be careful with any value larger than the largest integer value, because it may cause loss of accuracy:
Copy code The code is as follows:
$a = 9223372036854775807;
$b = 9223372036854775808;
var_dump($a === ($b - 1));
The output is false.
Now continuing the discussion at the beginning, as mentioned before, PHP's integers may be 32-bit or 64-bit, so it is decided that some codes that can run normally on 64-bit may fail due to invisible Type conversion causes precision loss, causing the code to not run properly on 32-bit systems.
So, we must be wary of this critical value. Fortunately, this critical value has been defined in PHP:
Copy code The code is as follows:
echo PHP_INT_MAX;
?>
Of course, to be on the safe side, we should use strings to store large integers, and use mathematical function libraries such as bcmath to perform calculations.
In addition, there is another key configuration that will confuse us. This configuration is php.precision. This configuration determines how many significant digits PHP outputs when it outputs a float value.
Finally, let’s look back at the question raised above, that is, what is the maximum value of a long integer to ensure that there will be no loss of precision after converting to float and then back to long?
For example, for an integer, we know that its binary representation is, 101. Now, let us right shift two bits to become 1.01, discard the implicit significant bit 1 of the high bit, and we get the binary representation of 5 stored in double The value is:
Copy code The code is as follows:
0/*Sign bit*/ 10000000001/*Exponent bit*/ 010000000000000000000000000000000000000000000000000
The binary representation of 5 is stored in the mantissa part without any loss. In this case, there will be no loss of precision when converting from double back to long.
We know that double uses 52 bits to represent the mantissa. Counting the implicit first 1, the total is 53 bits of precision. Then it can be concluded that if a long integer, the value is less than:
Copy code The code is as follows:
2^53 - 1 == 9007199254740991; //Keep in mind, we now assume that it is a 64bits long
Then, this integer will not lose precision when the long->double->long value conversion occurs.

Load balancing affects session management, but can be resolved with session replication, session stickiness, and centralized session storage. 1. Session Replication Copy session data between servers. 2. Session stickiness directs user requests to the same server. 3. Centralized session storage uses independent servers such as Redis to store session data to ensure data sharing.

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

Alternatives to PHP sessions include Cookies, Token-based Authentication, Database-based Sessions, and Redis/Memcached. 1.Cookies manage sessions by storing data on the client, which is simple but low in security. 2.Token-based Authentication uses tokens to verify users, which is highly secure but requires additional logic. 3.Database-basedSessions stores data in the database, which has good scalability but may affect performance. 4. Redis/Memcached uses distributed cache to improve performance and scalability, but requires additional matching

Sessionhijacking refers to an attacker impersonating a user by obtaining the user's sessionID. Prevention methods include: 1) encrypting communication using HTTPS; 2) verifying the source of the sessionID; 3) using a secure sessionID generation algorithm; 4) regularly updating the sessionID.

The article discusses PHP, detailing its full form, main uses in web development, comparison with Python and Java, and its ease of learning for beginners.

PHP handles form data using $\_POST and $\_GET superglobals, with security ensured through validation, sanitization, and secure database interactions.

The article compares PHP and ASP.NET, focusing on their suitability for large-scale web applications, performance differences, and security features. Both are viable for large projects, but PHP is open-source and platform-independent, while ASP.NET,

PHP's case sensitivity varies: functions are insensitive, while variables and classes are sensitive. Best practices include consistent naming and using case-insensitive functions for comparisons.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Zend Studio 13.0.1
Powerful PHP integrated development environment
