3

我有一个问题涉及计算机系统中浮点数和字节之间的表示差异。例如,float 如何从 float 转换为 int 并返回;它导致字节的完全不同的表示。有什么资源可以用来为我指明正确的方向吗?任何帮助深表感谢!我在网上找不到任何东西,正确方向的链接将非常有帮助!

4

4 回答 4

4

浮点数最常见的编码使用 IEEE 754。对于单精度数,有一个符号位 (s)、8 个指数位 (e) 和 23 个小数位 (f)。

对于 s、e 和 f 的大多数值,表示的值是 -1 s •2 e-127 •F,其中 F 是通过写“1”得到的数字。然后是 f 的 23 位,然后将该字符串解释为二进制数字。例如,如果 f 为 10000000000000000000000,则二进制数为 1.10000000000000000000000,即(十进制)为 1.5,因此 F 为 1.5。

只要 0 < e < 255,上述情况就成立。值 0 和 255 是特殊的。

当 e 为 0 时,表示的值与上面相同,只是 F 以“0”开头。而不是“1.”。特别是,如果 f 为零,则表示的值为零。如果 f 不为零,则这些被称为非正规数,因为它们小于上述主要方式中表示的正常值。

当 e 为 255 且 f 为 0 时,表示的值是 +infinity 或 -infinity,根据符号位 s。当 e 为 255 且 f 不为零时,表示的值称为 NaN,Not a Number,用于调试或捕获错误或其他特殊用途。有安静的 NaN(不会导致陷阱;它们通常用于您想要继续计算以获得最终结果,然后弄清楚如何处理 NaN)和信号 NaN(确实会导致陷阱;它们通常用于当您因为发生错误而要中止计算时)。

编码在不同平台上的显示方式可能会有所不同,尤其是 32 位内的字节顺序。有些平台不使用 IEEE 754 编码。

双精度编码使用相同的方案,只是e是11位,127(称为指数偏差)改为1023,f是52位。此外,指数的特殊值是它的 11 位最大值 2047,而不是 8 位最大值 255。

于 2012-07-10T18:27:42.793 回答
0

C 标准没有指定如何表示浮点值。每个实现/平台都可以自由地实现它们认为合适的浮点数。实现必须遵守某些约束,但位级表示是实现定义的。

由于您通常无法预测浮点数将如何存储或表示,因此没有真正的方法来回答这个书面问题。如果您考虑到特定的浮点实现,我们也许可以提供一些细节。然而,这些细节只与特定的实现相关。另请注意,不同的 CPU 架构可能会以不同的方式转换值,即使它们使用相同的浮点表示。

于 2012-07-10T18:13:32.083 回答
0

在一般情况下,将浮点值视为“精确”是危险的。一旦你有一个分数,一个浮点数可能是近似的。(如果分数可以精确地用二进制表示,它可能仍然是精确的,例如1/2。但例如,1/10将是一个近似值。)

有几个人向您指出了 Wikipedia 文章。阅读那些。基本上,浮点值是符号位、指数和尾数。如果你有一个浮点值,50.0那么浮点值看起来与 的整数表示完全不同50。(原不正确的讨论已删除;详情见评论。)

没有简单的方法可以将整数转换为浮点数,反之亦然。你的计算机的 CPU 有内置的指令来为你进行转换,或者你可以编写一个程序来完成它,但没有一个简单的技巧。

编辑:上面被编辑删除了我写了一些不正确的东西的部分。@Eric Postpischil 指出了我犯的主要错误:50 的值将存储为一个小数值,其幂次大于一,而不是我最初所说的。这是一个愚蠢的错误,我道歉。他还指出,“尾数”部分在技术上是“有效数”;我会简单地说,我经常看到它被称为“尾数”,无论这是否正确。

我将重复重要的部分:没有简单的方法可以将整数转换为浮点数,反之亦然。

于 2012-07-10T18:14:21.697 回答
0

特定平台的表示floatint在特定平台上的表示是严格定义的,并且该平台上的 C 编译器知道。这意味着总是有一个定义明确的算法可以将一个转换为另一个。在实践中,当使用自然平台特定类型时,转换由 CPU (FPU) 在内部执行。CPU 有一个专用命令,可以将float内存中的数据读取到内部 CPU 寄存器中。然后另一个命令可以将该数据作为值写回内存int。反之亦然。

例如,在 x86 平台上,float_value = int_value分配通常会被转换为一系列 CPU 命令,例如

fld int_value   ; read `int` value from `int_value` to the internal register
fst float_value ; save `float` value from the internal register to `float_value`

当涉及转换硬件不立即支持的算术数据类型时,C 编译器必须在生成的代码中逐字说明所有必要的转换步骤。有时,可能需要对语言甚至不支持的整数或浮点类型的支持,在这种情况下,必须手动实现转换。

于 2012-07-10T18:34:51.083 回答