danack/

float-hex

浮点数到十六进制字符串的转换,以及浮点数比较。

1.1.0 2022-03-30 15:11 UTC

This package is auto-updated.

Last update: 2024-08-29 05:31:09 UTC


README

提供将浮点数转换为十六进制字符串以及反向转换的函数,以及显示两个浮点数的二进制表示。

Build Status

示例

<?php
require __DIR__ . "/vendor/autoload.php";

use function FloatHex\floathex;
use function FloatHex\floathex32;
use function FloatHex\float_compare;

$value = 1.2345;

echo floathex($value) . "\n";
// Output: 3ff3c083126e978d

echo floathex32($value) . "\n";
// Output: 3f9e0419

echo float_compare(1.2345, 1.234500000001);
// Output:
// ┌──────┬─────────────┬──────────────────────────────────────────────────────┐
// │ Sign │ Exponent    │ Mantissa                                             │
// │    0 │ 01111111111 │ 0011110000001000001100010010011011101001011110001101 │
// │    0 │ 01111111111 │ 0011110000001000001100010010011011101010100100100101 │
// │    - │ ----------- │ --------------------------------------xxxxx-x-x-x--- │
// └──────┴─────────────┴──────────────────────────────────────────────────────┘

为什么?

Imagick 中的某些测试比较浮点数,试图确定浮点数是由于舍入误差还是较大的偏差而导致的,这很麻烦。

比较位更容易直观地看到发生了什么。例如,比较 0.3 与 0.1 + 0.2

<?php

echo float_compare(0.3, 0.1 + 0.2);

输出结果

┌──────┬─────────────┬──────────────────────────────────────────────────────┐
│ Sign │ Exponent    │ Mantissa                                             │
│    0 │ 01111111101 │ 0011001100110011001100110011001100110011001100110011 │
│    0 │ 01111111101 │ 0011001100110011001100110011001100110011001100110100 │
│    - │ ----------- │ -------------------------------------------------xxx │
└──────┴─────────────┴──────────────────────────────────────────────────────┘

直接可以看出,这两个数字之间的差异在最低位。

hexfloat 和 floathex32 可能对需要在文本通道中精确传输浮点数的人有用。

精确浮点数值

如果您想查看浮点数存储的确切值,可以使用 number_format 实现。

echo number_format(1.22,  64);

// Output is:
// 1.2199999999999999733546474089962430298328399658203125000000000000

待办事项

  • 检查 NAN 和 INF 附近的行为
  • 对错误输入字符串进行错误检测。