启发式以识别一系列4字节数据块是整数还是浮点数

fli*_*int 11 c++ language-agnostic algorithm floating-point artificial-intelligence

什么是最好的启发式,我可以用来确定一个X 4字节的块是整数还是浮点数?人类可以轻松地做到这一点,但我想以编程方式进行.

我意识到,因为每个位组合都会产生一个有效的整数和(差不多?)所有这些组合也会产生一个有效的浮点数,所以没有办法确定.但我仍然想确定最有可能的候选人(这几乎总是正确的;或者至少,人类可以做到这一点).

例如,让我们先取一系列4字节的原始数据,然后先将它们作为整数打印出来然后再作为浮点数打印出来:

1           1.4013e-45
10          1.4013e-44
44          6.16571e-44
5000        7.00649e-42
1024        1.43493e-42
0           0
0           0
-5          -nan
11          1.54143e-44

显然他们将是整数.

现在,另一个例子:

1065353216  1
1084227584  5
1085276160  5.5
1068149391  1.33333
1083179008  4.5
1120403456  100
0           0
-1110651699 -0.1
1195593728  50000

这些显然是漂浮物.

PS:我使用的是C++,但您可以使用任何语言,伪代码或英语进行回答.

Ala*_*lan 9

你的例子中的"常识"启发式似乎基本上等于范围检查.如果一个解释非常大(或一小部分,接近于零),那可能是错误的.检查浮点解释的指数,并将其与整数解释的正确静态强制转换为浮点数的指数进行比较.


Joh*_*ler 0

您将查看高 8 或 9 位。这就是浮点值的符号和尾数所在的位置。对于有效的浮点数据来说,0x00、0x80 和 0xFF 的值非常不常见。

\n\n

特别是,如果高 9 位全为 0,则仅当所有 32 位全为 0 时,这才可能是有效的浮点值。另一种说法是,如果指数为 0,则尾数也应该为零。如果高位为 1,接下来的 8 位为 0,则这是合法的,但也不太可能有效。它代表-0.0,这是一个合法的浮点值,但没有意义。

\n\n

用数字来表达。如果高字节为 0x00(或 0x80),则该值的大小最多为2.35e-38。普朗克常数为 6.62e-34 m2kg/s,大了 4 个数量级。质子的估计直径比这个大得多(估计为 1.6e\xe2\x88\x9215 米)。音频数据的最小非零值约为 2.3e-10。您不太可能看到浮点值是任何小于 2.35e-38 但为零的实数的合法测量值。

\n\n

向另一个方向走,如果高字节为 0xFF,则该值要么是无限、NaN 要么大于 3.4e+38。宇宙的年龄估计为 1.3e+10 年(1.3e+25 飞秒)。可观测宇宙大约有 e+23 颗恒星,阿瓦伽德罗星的数量是 6.02e+23。再次强调,大于 e+38 的浮点值很少出现在合法的测量中。

\n\n

这并不是说 FPU 无​​法加载或生成此类值,如果您使用现代 FPU,您肯定会在计算的中间值中看到它们。现代 FPU 将加载指数为 0 但其他位不为 0 的浮点值。这些称为非规格化值。这就是为什么您会看到小正整数显示为 e-42 范围内的浮点值,即使浮点数的正常范围仅下降到 e-38

\n\n

全 1 的指数代表无穷大。您可能不会在数据中找到无穷大,但您会比我更清楚。 -Infinity 是 0xFF800000,+Infinity 是 0x7F800000,Infinity 尾数中除 0 以外的任何值都是格式错误的。畸形的无穷大被用作 NaN。

\n\n

将 NaN 加载到浮点寄存器中可能会导致它引发异常,因此您需要使用整数数学来猜测数据是浮点还是整数,直到您相当确定它是整数为止。

\n

  • 我在这里看到的每一个断言都是完全错误的。符号+指数包含在高*9* 位中。0x00始终有效;如果下一位为 0,则该数字是非规格化的。0x80表示一个小的负值。0xff 位于任何大负值、负无穷大或 NAN 之前。 (2认同)
  • 抱歉,但这仍然是不正确的。(大多数)FPU 可以通过算术或转换的结果产生非规格化值,因此完全有可能“从 FPU 中”获得非规格化值。更一般地说,“有效”这个词在英语中有一个常见的含义,它不是“预期的”。虽然某些 FPU 不会生成某些位模式(通常是可能的 NaN 编码的子集),但没有标准可以保证这对于所有 FPU 都是如此(事实上,事实并非如此)。 (2认同)