浮動小数点数 (例: 152.35964) を 2 進数、8 進数、10 進数、16 進数に変換したいと考えています。
私はグーグルで検索しましたが、私が望むものに関連するものは何も見つかりませんでした。私が見つけたのはドキュメントだけでしたが、これらの関数 (bindec()、octdec()、binhex() など、および base_convert()) は整数のみで動作し、float または double が必要です。
ありがとうございました!
浮動小数点数 (例: 152.35964) を 2 進数、8 進数、10 進数、16 進数に変換したいと考えています。
私はグーグルで検索しましたが、私が望むものに関連するものは何も見つかりませんでした。私が見つけたのはドキュメントだけでしたが、これらの関数 (bindec()、octdec()、binhex() など、および base_convert()) は整数のみで動作し、float または double が必要です。
ありがとうございました!
PHP マニュアルのこのページにあるNstiacの投稿をご覧ください。彼は、float を IEEE 754 単精度 32 ビットに変換するルーチンと、その逆のルーチンを提供しています。
引用された例の152.35964に対して、「43185c11」の16進値が表示されます。これはあなたが期待しているものです。
または、そのロジックの代替バージョン:
$value = 152.35964;
var_dump($value);
$packedValue = pack('f',$value);
$packedLength = strlen($packedValue);
$packedHexDisplay = '';
for($i = $packedLength-1; $i >= 0; --$i) {
$packedHexDisplay .= str_pad(dechex(ord($packedValue[$i])),2,'0',STR_PAD_LEFT);
}
var_dump($packedHexDisplay);
$unpackedValue = unpack('f',$packedValue);
var_dump($unpackedValue);
難しい方法:
$signmap = Array(
-1 => '-',
1 => ''
);
function fractur($f)
{
if ($f < 0)
{
$sign = -1;
$f = -$f;
} else {
$sign = 1;
};
$intp = floor($f);
$fracp = $f - $intp;
return Array($sign, $intp, $fracp);
};
function float2var($f, $spec)
{
global $signmap;
list($sign, $intp, $fracp) = fractur($f);
$format = sprintf('%%s%s.%s', $spec, $spec);
$ret = sprintf($format, $signmap[$sign], $intp, $fracp * 16777216);
// 64-bit systems can use the next line instead
//$ret = sprintf($format, $signmap[$sign], $intp, $fracp * 18014398509481984);
return rtrim(rtrim($ret, '0'), '.');
};
function float2bin($f)
{
return float2var($f, '%b');
};
function float2oct($f)
{
return float2var($f, '%o');
};
function float2hex($f)
{
return float2var($f, '%x');
};
var_dump(float2bin(10.5));
var_dump(float2bin(10));
var_dump(float2bin(-2.5));
var_dump(float2bin(2.5));
var_dump(float2oct(2.5));
var_dump(float2hex(2.5));