【问题标题】:cfenv rounding behaviour in CC中的cfenv舍入行为
【发布时间】:2023-03-22 04:53:02
【问题描述】:

cfenv 提供 API 来控制 C 中浮点运算的舍入模式。具体而言,可能的控制标志包括 FE_DOWNWARDFE_UPWARD,它们分别负责向更小或更大的值舍入。

但是,如果这些标志会影响单个浮点运算或整个表达式,我会感到困惑。例如让:

fesetround(FE_UPWARD);
double res = c - a * tanh(b);

如果标志FE_UPWARD 影响整个表达式,那么res 将包含c - a * tanh(b) 的合理上限。但是,如果它影响单个浮点运算,则将首先评估(并最大化)a * tanh(b),并且不再保证 res 包含上限。

标志FE_UPWARD 是给出整个浮点表达式的上限还是只给出单个浮点运算的上限?

【问题讨论】:

  • 你为什么不检查一下生成的汇编代码做了什么?
  • cfenv 是浮点环境设施标头的 C++ 名称。 C 名称是fenv.h

标签: c floating-point rounding


【解决方案1】:

如果 C 实现支持浮点舍入模式,它会影响单个操作。这可能包括库例程——理想情况下,它应该包括库例程,但数学库中通常缺乏对舍入模式的支持。

浮点舍入模式不会对您的程序计算的表达式进行全局操作。通常,编译器无法分析或修改您的表达式以使其正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2015-09-17
    相关资源
    最近更新 更多