|
Posted by Oli Filth on 02/23/06 16:51
yawnmoth said the following on 23/02/2006 06:00:
> According to php.net, the largest possible float is ~1.8e308.
> wikipedia.org offers more insight, suggesting that is, exactly,
> 0x7FEFFFFFFFFFFFFF. This sorta begs the question... how can this
> number be represented in PHP without resorting to the decimal notation?
>
The maximum floating-point value is platform dependent. For a 64-bit
platform, it's ~1.8e308, but for a 32-bit platform it's ~3.4e38
(assuming you're using the IEEE 754 standard).
This code converts from a hex-representation to a floating-point
representation (for 32-bit):
define("LENGTH", 32);
define("SIGN_BIT", 31);
define("EXPONENT_MSB", 30);
define("EXPONENT_LSB", 23);
define("MANTISSA_MSB", 22);
define("MANTISSA_LSB", 0);
function hex2float($strHex)
{
$dec = hexdec($strHex);
$sign = ($dec & (1 << SIGN_BIT)) != 0;
$exp = (($dec & ((2 << EXPONENT_MSB) - (1 << EXPONENT_LSB))) >>
EXPONENT_LSB)
- (1 << (EXPONENT_MSB - EXPONENT_LSB))
- (MANTISSA_MSB - MANTISSA_LSB);
$man = (($dec & ((2 << MANTISSA_MSB) - (1 << MANTISSA_LSB))) >>
MANTISSA_LSB)
+ (2 << (MANTISSA_MSB - MANTISSA_LSB));
$float = floatval($man * pow(2, $exp) * ($sign ? -1 : 1));
}
For a 64-bit version, you'll need to alter the constants; you can get
the required values from
http://stevehollasch.com/cgindex/coding/ieeefloat.html.
Note that this code doesn't deal with special cases, i.e. NaN, infinity,
etc.
--
Oli
Navigation:
[Reply to this message]
|