【问题标题】:How to find out the size of a float in PHP?如何在 PHP 中找出浮点数的大小?
【发布时间】:2018-11-15 21:49:59
【问题描述】:

我在运行 Windows 10 Home Single Language 64 位操作系统的机器上使用 PHP 7.2.5(使用最新版本的 XAMPP 安装) .

据我所知,在 PHP 中,整数和浮点数的大小取决于平台。

PHP 提供了一个预定义的常量PHP_INT_SIZE 来查找整数的大小,但它没有提供任何此类常量来查找浮点数的大小。

那么,我的问题是如何在 PHP 中找出浮点数的大小?

附: :我已经推荐了Previously Asked Question,但无法为我的问题找到可靠、高效和令人满意的解决方案。在这个问题的答案结束时,答案的作者做出了以下假设

我认为“平台相关”意味着它在 32 位平台上使用 4 个字节(传统的浮点大小),在 64 位和更大的平台上使用 8 个字节(传统的双精度)。

我认为这是模糊的,因为它没有更多相关的证据或证据。

【问题讨论】:

  • 来自docs浮点数的大小取决于平台,尽管最大约 1.8e308 和大约 14 位十进制数字的精度是一个常见值(64 位IEEE 格式)。 这对我来说,32 位浮点数确实是 4 个字节,而 64 位浮点数是传统的双精度数,因此是 8 个字节。不幸的是,您发现它含糊不清,真的无能为力:p
  • @Loek :我从文档中阅读了相同的声明。您再次假设 PHP 中的 float 大小。通过预定义的常量 PHP_INT_SIZE 我可以获得整数的大小作为输出。如果是浮点数,我也希望浮点数的大小作为输出,而不是其他人做出的某种假设的形式。如果您能以某个程序的输出形式向我提供浮点数的大小,我会相信您的假设。
  • @Loek:平台相关并不意味着 32 位架构上的 32 位和 64 位架构上的 64 位。浮点值的处理方式通常与整数不同,包括不同的寄存器和不同的指令,并且不像整数那样与架构宽度密切相关。更可能根据处理器的速度和浮点运算的带宽或对精度的期望/需求来做出决定。
  • 请注意,从 php 7.2 开始,就有 这样一个常量:3v4l.org/QpHOI
  • @EricPostpischil 很公平,好点。

标签: php floating-point integer size constants


【解决方案1】:

浮点数的大小取决于平台,但从 PHP 7.2 开始,there actually is a constant PHP_FLOAT_MAX

因为它依赖于平台,所以没有明确的答案。但是您至少可以通过 PHP 7.2 中的这个常量看到您平台上的最大大小:https://3v4l.org/QpHOI

要计算字节数,我们必须将非常大的浮点数转换为二进制,然后我们可以手动计算字节数,请参见此处:https://3v4l.org/ASZbs

显然 3v4l.org 可以处理一些相当大的浮点数,最多 128 个字节!

感谢 PHP 文档中的匿名用户 created a function to convert 32+ bit floats into binary 我公然复制粘贴。

【讨论】:

  • 新常量没有给你浮点数的大小。它为您提供了相应平台的最大浮点值。所以,这不能回答我的问题。
  • 所以将最大值转换为二进制并计算我猜的字节数?现在没时间,但可以在今天晚些时候尝试。
  • @SerialKisser 检查这个(这是糟糕的复制粘贴,但它可以完成工作):3v4l.org/ASZbs
【解决方案2】:

几乎肯定会使用 IEEE 64 位格式,因为这基本上是当今每个平台都使用的。您可以为此添加一个断言,例如

assert((1.0+pow(2.0,-52))-1 != 0)
assert((1.0+pow(2.0,-53))-1 == 0)

将检查格式是否正好有 53 个有效位。

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 2020-08-23
    • 2014-10-23
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2018-07-09
    相关资源
    最近更新 更多