Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';硬浮点数和软浮点数的区别是什么?_C_Linux_Floating Point_Arm_Libc - Fatal编程技术网

C 什么';硬浮点数和软浮点数的区别是什么?

C 什么';硬浮点数和软浮点数的区别是什么?,c,linux,floating-point,arm,libc,C,Linux,Floating Point,Arm,Libc,当我用交叉工具链编译C代码时,链接器打印出警告页面,说我的可执行文件使用硬浮动,而我的libc使用软浮动。区别是什么?听起来您的libc是为软件浮点操作而构建的,而您的exe是在假设硬件支持浮点的情况下编译的。在短期内,您可以强制软浮动作为编译器标志。(如果您使用的是gcc,我认为它是-msoft float) 从长远来看,如果您的目标处理器具有浮点操作的硬件支持,您通常会希望构建或找到一个跨工具链,并启用硬件浮点以提高速度。有些处理器系列有型号变体,有些有硬件支持,有些没有硬件支持。因此,举例

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

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


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

硬浮点使用片上浮点单元。软浮动模拟软件中的浮动。区别在于速度。奇怪的是,在同一个目标体系结构上使用这两种芯片,因为该芯片要么有FPU,要么没有FPU。可以使用-msoft float在GCC中启用软浮点。如果使用硬件浮点运算,您可能需要重新编译libc以使用硬件浮点运算。

有三种方法进行浮点运算:

  • 如果您的CPU有FPU,请使用浮点指令。(快速)
  • 让编译器将浮点运算转换为整数运算。(慢)
  • 使用浮点指令和不带FPU的CPU。CPU将生成异常(保留指令、未实现指令或类似指令),如果操作系统内核包含浮点仿真器,它将模拟这些指令(速度最慢)

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

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


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

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

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

Debian有关于
-mfloat abi
的三个选项的信息

  • soft
    -这是纯软件
  • softfp
    -这支持硬件FPU,但ABI是软兼容的
  • hard
    -ABI使用浮点或VFP寄存器
链接器(加载程序)错误是因为您有一个共享库,该库将在整数寄存器中传递浮点值。您仍然可以使用
-mfpu=vfp
等编译代码,但您应该使用
-mfloat abi=softfp
,这样,如果libc需要浮点,它将以库理解的方式传递

Linux内核可以支持VFP指令的仿真。显然,对于这种情况,最好使用
-mfpu=none
进行编译,并让编译直接生成代码,而不是依赖于任何Linux内核仿真。然而,我不相信OP的错误实际上与这个问题有关。它是单独的,也必须与
-mfloat abi
一起处理

与此相反;libc是硬浮动的,但应用程序只是软浮动的。它有一些解决问题的方法,但是使用正确的选项重新编译总是最容易的


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

如果是ARM体系结构,请将其放入标记:-)@Nils Pipenbrinck:MIPS芯片也有此问题Modern GCC(~4.8+)版本支持“多库”,其中包含硬浮点和软浮点库。早期版本要求使用特定版本构建编译器。当链接到“多库”gcc发行版时,有时需要正确库的路径,因为有多个版本的库(构建编译器需要更长的时间)。目录名可能是“hf”、“hardf”、“libhf”或“hard float”,但它们通常位于常规的“soft”目录下或附近的位置。这是正确的答案。浮点数的调用转换需要在代码和libc之间匹配。如果您从未调用过任何浮点libc函数,它可能仍然适用于不匹配的情况。“在相同的目标体系结构上看到两者都使用是很奇怪的”这对于一个库来说是有意义的,它在精度关键的部分是机器独立的、位精确的(软浮点)和快速的(硬浮点)在小偏差无关紧要的部分,它发生在32位ARM上。