【问题标题】:Is there a functional difference between "2.00" and "2.00f"?“2.00”和“2.00f”之间有功能区别吗?
【发布时间】:2011-12-03 13:44:23
【问题描述】:

我问是因为我使用的是 Box2D 库,它主要调用浮点参数。虽然我看到很多使用 0.00f 格式的示例代码,但我不太确定它与普通的旧 0.00 之间是否存在实际差异。

以后不添加额外的 f 会伤害自己吗?是速度问题吗?是否有某种内涵需要 f 加数而其他人不需要?

TL;DR:为什么我应该使用 0.00f 而不是 0.00?

【问题讨论】:

标签: c++ floating-point precision literals suffix


【解决方案1】:

【讨论】:

  • 不错的总结...
【解决方案2】:

f 后缀使它成为单精度(浮点)字面量,而不是双精度字面量。这通常意味着 32 位而不是 64 位浮点数。

浮点常量默认为 double 类型。通过使用后缀 f 或 l(或 F 或 L — 后缀不区分大小写),常量可以分别指定为 float 或 long double。

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=VS.100).aspx

【讨论】:

  • 也许“literal”比“constant”更合适。 literal 的类型是有问题的。
  • float 的大小不一定是 32 bit。它是实现定义的。
  • 谢谢,你说得对,“字面”在这种情况下似乎更合适。也固定位大小部分。
  • 存储的位数和类型采用的精度取决于实现。 32 位和 64 位存储很常见,但不是通用的。
  • 所以问题是:是否有任何“十进制”数字通过 double 和 float 之间的双跳而失去精度?如果有,编译器是否真的在进行转换?
【解决方案3】:

有区别。 2.00 的类型为 double2.00f 的类型为 float。确切的精度和格式含义取决于您的平台。使用其中一个是否会在您的代码中产生实际差异取决于使用它的上下文。

作为显式类型变量(基本数字类型)的初始化器,没有区别,但在函数调用中使用时,它可能会影响使用哪个重载或模板特化。

显然,当在使用autotype-specifier 的声明中用作初始化程序或作为 decltype-specifier 中的表达式时,被声明的对象的类型将受到影响。

decltype(2.00) x = 2.00f; // confusing
decltype(2.00f) y = 2.00; // also confusing

auto d = 2.00;
auto f = 2.00f;

【讨论】:

    【解决方案4】:

    2.00 的类型是double2.00f 的类型是float

    后缀f 将文字2.00 转换为浮点类型,从而降低其精度。否则,字面量为double 类型。

    【讨论】:

      【解决方案5】:

      默认假设是double。指定f 后缀可确保将其解释为float

      【讨论】:

        【解决方案6】:

        只要您将它们分配给float,就绝对没有区别,因为 可以在所有数字类型中精确且正确地表示。

        重要的区别是字面量的类型double 代表2.0float 代表2.0fint 代表2。所以它在参数类型推导上有所不同:

        void foo(int) { cure_cancer(); };
        void foo(float) { wipe_hard_disk(); }
        void foo(double) { exit(0); }
        
        foo(2);
        foo(2.0f);
        foo(2.0);
        

        【讨论】:

          猜你喜欢
          • 2015-12-03
          • 1970-01-01
          • 2012-02-16
          • 1970-01-01
          • 2016-11-11
          • 2019-07-07
          • 1970-01-01
          • 2020-01-11
          • 2016-12-02
          相关资源
          最近更新 更多