代码之家  ›  专栏  ›  技术社区  ›  Evan Kroske

硬浮点数和软浮点数有什么区别?

  •  89
  • Evan Kroske  · 技术社区  · 14 年前

    当我用我的交叉工具链编译C代码时,链接器会打印一页页的警告,说我的可执行文件使用硬浮点,而libc使用软浮点。有什么区别?

    5 回复  |  直到 11 年前
        1
  •  106
  •   nmichaels    14 年前

        2
  •  33
  •   ninjalj    14 年前

    • 让编译器把浮点运算转换成整数运算((慢)
    • 使用浮点指令和没有FPU的CPU。CPU将生成异常(保留指令、未实现指令或类似指令),如果操作系统内核包含浮点仿真器,它将模拟这些指令(最慢)。
        3
  •  25
  •   Community Tales Farias    7 年前

    严格地说,所有这些答案在我看来都是错误的。

    VFP wiki 有关于以下三种选择的信息: -mfloat-abi ,

    • soft -这是纯软件
    • softfp ABI公司 软兼容。
    • hard -ABI使用 寄存器。

    链接器(加载器)错误是因为您有一个共享库,它将在整数寄存器中传递浮点值。您仍然可以使用 -mfpu=vfp 等,但你应该使用 -mfloat-abi=softfp 伦敦银行 需要一个float,它以库理解的方式传递。

    -mfpu=none 对于这种情况,让编译程序直接生成代码,而不是依赖于任何Linux内核仿真。但是,我不认为OP的错误与这个问题有关。它是独立的,也必须与 -mfloat abi公司 .

    Armv5 shared library with ArmV7 CPU 与此相反;这个 软的

    另一个问题是Linux内核必须支持VFP任务(或任何存在的ARM浮点)来保存/恢复上下文开关上的寄存器。

        4
  •  13
  •   Digikata    14 年前

    听起来,libc是为软件浮点操作而构建的,而exe是在假设硬件支持浮点的情况下编译的。在短期内,您可以强制软浮点作为编译器标志(如果您使用gcc,我认为它是-msoft float)

    从长远来看,如果目标处理器的硬件支持浮点运算,则通常需要构建或找到一个跨工具链,并启用硬件浮点运算以提高速度。有些处理器系列有型号变体,有些有硬件支持,有些没有硬件支持。因此,举个例子,仅仅说你的处理器是ARM不足以知道你是否支持硬件浮点运算。

        5
  •  9
  •   starblue    14 年前

    计算可以通过浮点硬件或基于整数运算的软件来完成。

    在硬件上做起来要快得多,但是许多微控制器没有浮点硬件。在这种情况下,您可以避免使用浮点(通常是最好的选择)或依赖于软件中的实现,这将是C库的一部分。

    在一些控制器系列中,例如ARM,浮点硬件在该系列的某些型号中存在,但在其他型号中不存在,因此这些系列的gcc同时支持这两种类型。你的问题似乎是你把这两个选择搞混了。