danack / float-hex
浮点数到十六进制字符串的转换,以及浮点数比较。
1.1.0
2022-03-30 15:11 UTC
Requires
- php: >= 7.4
Requires (Dev)
- danack/coding-standard: 0.2.0
- infection/infection: ^0.15.3
- phpstan/phpstan-strict-rules: ^0.11
- phpunit/phpunit: 9.0.1
- slevomat/coding-standard: ^4.8.4
- squizlabs/php_codesniffer: ^3.3.1
- yoast/yoastcs: 1.0
This package is auto-updated.
Last update: 2024-08-29 05:31:09 UTC
README
提供将浮点数转换为十六进制字符串以及反向转换的函数,以及显示两个浮点数的二进制表示。
示例
<?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 附近的行为
- 对错误输入字符串进行错误检测。