====== PHP RFC: Add pack()/unpack() endianness modifiers for floating-point numbers ====== * Version: 1.0 * Date: 2026-01-30 * Author: Alexandre Daubois, * Status: Under discussion ===== Introduction ===== This RFC proposes extending the endianness modifier syntax (< and >) to floating-point format codes in PHP's pack() and unpack() functions. Currently, PHP's pack/unpack functions support floating-point numbers with dedicated format letters: * f: single-precision float (4 bytes, machine byte order) * d: double-precision float (8 bytes, machine byte order) * g/G: single-precision float (little/big endian) * e/E: double-precision float (little/big endian) The new modifier syntax using < and > is not supported yet. Adding the modifier support to float formats would provide consistency with [[pack-unpack-endianness-signed-integers-support|the endianness modifier syntax]], recently accepted for integers in the upcoming 8.6. This RFC presents an evolution mentioned in the "Future scope" section of the accepted RFC. ===== Perl Specification Reference ===== According to the Perl documentation (https://perldoc.perl.org/functions/pack), Perl supports endianness modifiers on floating-point format codes: f< single-precision float, little-endian byte order f> single-precision float, big-endian byte order d< double-precision float, little-endian byte order d> double-precision float, big-endian byte order ===== Proposed Solution ===== This RFC proposes adding endianness modifiers to floating-point format codes: * f</f> for single-precision float (4-byte, little/big endian) * d</d> for double-precision float (8-byte, little/big endian) **Example usage:** d>', 3.14159, 2.71828); // Unpacking [$float, $double] = array_values(unpack('f **Equivalence with Existing Formats:** ', 3.14) === pack('G', 3.14); pack('d<', 3.14) === pack('e', 3.14); pack('d>', 3.14) === pack('E', 3.14); ?> ===== Error Handling ===== Modifiers on formats with inherent endianness (g/G and e/E) will emit a ValueError, for example: ', 3.14); // ValueError: Endianness modifier '>' cannot be applied to format code 'G' which already has inherent endianness pack('e<', 3.14); // ValueError: Endianness modifier '<' cannot be applied to format code 'e' which already has inherent endianness pack('E>', 3.14); // ValueError: Endianness modifier '>' cannot be applied to format code 'E' which already has inherent endianness ?> ===== Platform Consideration ===== PHP’s floating-point pack/unpack formats operate on the platform’s native floating-point representation and size. In practice this is typically IEEE 754 with 32 bits float and 64 bits double. This RFC does not introduce a new floating-point representation, only a new syntax for already existing format code. ===== Future Scope ===== A possible next step to this RFC would be to deprecate e, E, g and G format letters. These letters are not supported by Perl's pack() and unpack() functions and become useless with the introduction of the endianness modifier syntax. ===== Backward Incompatible Changes ===== None. The modifier syntax is opt-in and does not affect existing format strings. ===== Proposed PHP Version(s) ===== PHP 8.x (next minor) ===== Voting Choices ===== Yes / No vote requiring 2/3 Yes votes to pass. * Yes * No * Abstain ===== References ===== * Integer endianness modifiers RFC: https://wiki.php.net/rfc/pack-unpack-endianness-signed-integers-support * Perl pack documentation: https://perldoc.perl.org/functions/pack * PHP pack documentation: https://www.php.net/manual/en/function.pack.php * Discussion thread: https://externals.io/message/129956