【问题标题】:How does the CPU "cast" a floating point x87 (i think) value?CPU如何“投射”浮点x87(我认为)值?
【发布时间】:2020-05-06 22:27:17
【问题描述】:

我只是想知道 CPU 如何“转换”浮点数。 我的意思是,我想当我们在 C/C++ 中使用“float”或“double”时,编译器使用的是 x87 单元,还是我错了? (我找不到答案)那么,如果是这种情况并且浮点数没有被模拟,编译器如何转换它?

【问题讨论】:

  • 转换有特殊说明,编译器只需发出即可。此外,标量和向量转换之间存在差异,但手动转换的时间已经过去了。
  • 编译器只需将其存储为适当的格式供 CPU 读取。然后它指向这个存储并且基本上说'请一个fld'。
  • 某些处理器具有特定的浮点寄存器,因此不需要“强制转换”。一个值直接从内存加载到寄存器或从寄存器直接存储到内存中。
  • “cast”操作告诉编译器以不同的方式处理变量。将整数转换为双精度会告诉编译器您希望将整数视为浮点数。编译器可能会发出从整数转换为浮点的 CPU 指令,或者编译器可能会将整数转换为浮点格式,然后存储到寄存器或内存中。
  • @usr2564301:编译器不需要自己转换数字。 x86 架构有一个fild 指令,它从内存中加载一个整数并将其转换为浮点数。

标签: c++ c casting x87


【解决方案1】:

我的意思是,当我们在 C/C++ 中使用“float”或“double”时,编译器使用的是 x87 单元,还是我错了?

在现代英特尔处理器上,编译器可能会使用 SSE/AVX 寄存器。 FPU 通常不经常使用。

我只是想知道 CPU 是如何“转换”浮点数的。

将整数转换为浮点数的计算基本上是(忽略一些细节):

  • 从整数的二进制(对于无符号类型)或二进制补码(对于有符号类型)表示开始。
  • 如果数字为零,则返回所有位为零。
  • 如果它是负数,请记住这一点并将数字取反使其为正数。
  • 找到整数中设置的最高位。
  • 找到适合目标格式有效位的最低位。 (例如,对于float 常用的 IEEE-754 binary32 格式,24 位适合有效位,因此最高位设置后的第 25th 位不适合。)
  • 将数字在有效数字结束的位置四舍五入。
  • 计算指数,它是最高位集所在位置的函数。添加用于编码指数的“偏差”(二进制 32 为 127,二进制 64 为 1023)。
  • 组合一个符号位、指数位和有效数位(省略高位,因为它始终为 1)。返回这些位。

该计算准备表示浮点数的位。 (它省略了涉及特殊情况的细节,如 NaN、无穷大和次正规数,因为在将典型的整数格式转换为典型的浮点格式时不会出现这些情况。)

该计算可以“在软件中”(即使用用于移位、测试值等的通用指令)或“在硬件中”(即使用用于进行转换的特殊指令)执行。所有台式计算机都有这方面的说明。用于专用嵌入式的小型处理器可能没有这样的指令。

【讨论】:

    【解决方案2】:

    不清楚你的意思是什么

    “转换”一个浮点数。 ?

    如果目标体系结构具有 FPU,那么编译器将发出 FPU 指令以操作浮点变量,这里没有谜团...... 为了将 float 变量分配给 int 变量,float 必须被截断或四舍五入(向上或向下)。为此目的通常存在特殊说明。

    如果目标架构是“无 FPU”,那么编译器(工具链)可能会使用可用的 CPU 指令提供浮点运算的软件实现。例如,像 a = x * y 这样的表达式;将等价于 a = fmul(x, y);其中 fmul() 是编译器提供的特殊函数(内在),可以在没有 FPU 的情况下进行浮点运算。当然,这通常比使用硬件 FPU 慢得多。如果性能很重要,则在此类平台上不使用浮点运算,可以使用定点运算https://en.wikipedia.org/wiki/Fixed-point_arithmetic

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多