【问题标题】:How a floating point literal is treated either double or float in Visual C++?在 Visual C++ 中如何处理浮点字面量或浮点数?
【发布时间】:2012-01-06 12:30:11
【问题描述】:

假设float a = (1.5 * b) 其中b 是浮点数,那么如何评估这个表达式? 1.5 被视为双精度还是浮点数?

【问题讨论】:

    标签: c++


    【解决方案1】:

    1.5 是双精度的,用 1.5f 表示浮点数,它的实际作用:

    float a = (float)(1.5 * (double)b)

    【讨论】:

      【解决方案2】:

      1.5 是一个浮点文字,一个双精度值。 C++032.13.3 Floating literals有话要说:

      浮点文字由整数部分、小数点、小数部分、e 或 E、可选带符号整数指数和可选类型后缀组成。 ...浮动文字的类型是双精度的,除非后缀明确指定。

      13.3.3.1 Standard conversion sequences 部分定义了处理转换的方式,但在这里重复有点枯燥。可以说浮点提升已经完成,4.6 Floating point promotion 部分声明:

      float 类型的右值可以转换为 double 类型的右值。值不变。

      因此float b 被提升为双精度以执行乘法。

      然后使用(有效地)临时的double 执行计算,并将结果硬塞回float a

      所以,有效地:

      float b = something;
      
      double xyzzy0 = 1.5;
      double xyzzy1 = (double)b;
      double xyzzy2 = xyzzy0 * xyzzy1;
      float a = xyzzy2;
      

      最后一步可能有问题。 4.8 Floating point conversions 部分(包括像 floatdouble 这样的更安全的促销活动)指出:

      浮点类型的右值可以转换为另一种浮点类型的右值。如果源值可以在目标类型中精确表示,则转换的结果就是该精确表示。如果源值介于两个相邻的目标值之间,则转换的结果是实现定义的选择这些值中的任何一个。否则,行为未定义。

      允许作为浮点提升的转换从浮点转换集中排除。

      换句话说,如果乘法结果超出浮点数范围,则所有赌注都将关闭。如果b 大约是浮点数最大绝对值的 67%(正或负,无关紧要),则很可能会发生这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多