search
HomeBackend DevelopmentPHP TutorialWhat 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.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/998815.htmlTechArticleYou should know PHP floating point number knowledge, PHP floating point number knowledge PHP is a weakly typed language, with such characteristics, Seamless and transparent implicit type conversion is required. PHP internally uses zval to save any...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Explain how load balancing affects session management and how to address it.Explain how load balancing affects session management and how to address it.Apr 29, 2025 am 12:42 AM

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.

Explain the concept of session locking.Explain the concept of session locking.Apr 29, 2025 am 12:39 AM

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

Are there any alternatives to PHP sessions?Are there any alternatives to PHP sessions?Apr 29, 2025 am 12:36 AM

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

Define the term 'session hijacking' in the context of PHP.Define the term 'session hijacking' in the context of PHP.Apr 29, 2025 am 12:33 AM

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.

What is the full form of PHP?What is the full form of PHP?Apr 28, 2025 pm 04:58 PM

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.

How does PHP handle form data?How does PHP handle form data?Apr 28, 2025 pm 04:57 PM

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

What is the difference between PHP and ASP.NET?What is the difference between PHP and ASP.NET?Apr 28, 2025 pm 04:56 PM

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,

Is PHP a case-sensitive language?Is PHP a case-sensitive language?Apr 28, 2025 pm 04:55 PM

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.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

DVWA

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

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

MantisBT

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

Zend Studio 13.0.1

Powerful PHP integrated development environment