2.1.53. --fpmode=model

此选项指定浮点遵从性,并设置库属性和浮点优化。

语法


--fpmode=model

其中 model 是下列选项之一:

ieee_full

由 IEEE 标准保证的所有工具、操作和表示对单精度和双精度都可用。 可在运行时动态选择操作模式。

此选项定义下列符号:


__FP_IEEE

__FP_FENV_EXCEPTIONS

__FP_FENV_ROUNDING

__FP_INEXACT_EXCEPTION

ieee_fixed

使用舍入到最接近的数且无不精确异常的 IEEE 标准。

此选项定义下列符号:


__FP_IEEE

__FP_FENV_EXCEPTIONS

ieee_no_fenv

使用舍入到最接近的数且无异常的 IEEE 标准。 此模式是无状态的,并与 Java 浮点算术模型兼容。

此选项定义符号 __FP_IEEE

std

使用非正规数清零、舍入到最接近的数且无异常的 IEEE 有限值。 此选项与标准 C 和 C++ 兼容,并且是缺省选项。

将根据 IEEE 标准预测标准有限值。 但存在下列限制:

  • 可能无法在 IEEE 模型定义的所有环境中生成非数字和无穷大。 即使生成了,它们的符号也可能有所不同。

  • 零符号可能不是 IEEE 模型预测的符号。

fast

执行会对精度产生较小损失的更积极的浮点优化,以显著提高性能。 此选项定义符号 __FP_FAST

此选项会导致与 ISO C 或 C++ 标准不完全兼容的行为。 但数字稳健的浮点程序的行为应该是正确的。

可执行许多转换,其中包括:

  • 如果所有浮点参数都可完全以单精度值形式表示,则双精度数学函数可转换为等效的单精度函数,并且会直接将结果转换为单精度值。

    仅当所选库包含等效的单精度函数(例如,所选库为 rvctaeabi_glibc)时,才会执行此转换。

    例如:

    
    float f(float a)
    
    {
    
        return sqrt(a);
    
    }
    
    

    将转换为

    
    float f(float a)
    
    {
    
        return sqrtf(a);
    
    }.
    
    
  • 对于限定为单精度的双精度浮点表达式,如果比较有利,会用单精度进行计算。 例如,float y = (float)(x + 1.0) 将以 float y = (float)x + 1.0f 形式计算。

  • 将除以浮点常数替换为乘以其倒数。 例如,x / 3.0 将以 x * (1.0 / 3.0) 形式计算。

  • 在调用数学函数后,不能保证 errno 的值与 ISO C 或 C++ 标准兼容。 这使编译器可以对 VFP 平方根指令进行内联,而不是调用 sqrt()sqrtf()

另请参阅

  • 编译器用户指南第 4-30 页的--fpmode 选项

  • install_directory\RVDS\Examples\...\vfpsupport 中的《ARM 应用程序注释 133 - 使用带 RVDS 的 VFP》

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential