1

在 C++ 中始终使用后缀“f”作为浮点数有什么好处?

一方面我的代码变得一团糟,我的意思是我有很多数学公式,想象一下,而不是简单地写 1,而是写 1.0f。它会使代码混乱。

但我想知道这方面是否有优化或其他方面?

谢谢

4

5 回答 5

4

有时它变得必要

考虑这个函数模板:

template<typename T>
void f(T a, T b);

float get_value(); //consider this too!

现在看到这个:

f(get_value(), 1);   //compilation error
f(get_value(), 1.0); //compilation error
f(get_value(), 1.0f); //okay

在前两个调用中,模板参数推导失败,因此它们无法编译。在ideone自己查看错误。

请注意 的 类型1int1.0double1.0ffloat

于 2012-07-12T16:41:28.263 回答
1

编译器几乎可以肯定地计算出来,因此没有运行时性能损失。

明确的原因是避免编译器警告有关隐式转换,避免可能出现意外行为的转换,以及在类型推导上下文中推导特定类型或强制调用特定重载。

这是一个示例,其中源想要将值表示为分数,但由于文字类型错误而得到错误的值:

float a = 3/4; // produces 0.0f instead of 0.75f

这是由隐式转换引起的警告:

tmp.cpp:4:15: warning: implicit conversion loses floating-point precision:
      'double' to 'float' [-Wconversion]
    float a = 0.1;
          ~   ^~~

这是由于不具体而导致的模棱两可的过载错误的情况:

tmp.cpp:6:5: error: call to 'foo' is ambiguous
    foo(1);
    ^~~
tmp.cpp:2:6: note: candidate function
void foo(unsigned char a);
     ^
tmp.cpp:3:6: note: candidate function
void foo(float b);
     ^
于 2012-07-12T16:37:21.140 回答
0

1.0或者1.是一个double常数

1.0f是一个float常数

它们是有区别的。

于 2012-07-12T16:36:32.170 回答
0

它可以消除警告。

顺便说一句,根据您的编译器,幕后浮点数被提升为 double 以进行计算。

于 2012-07-12T16:36:43.073 回答
0

指定 double 与 float 的另一种用途是 FORTRAN 的遗留问题,它可能会或可能不会困扰您的编译器。在过去的日子里,FORTRAN 仅以您指定的精度存储数据,将垃圾留在最后一位数字之外的未指定字节中。编码 x = 1.0 并让 x 实际上等于 1.0987659987623 是很可能的,这取决于“x”的类型(在 FORTRAN 中它是一个单精度浮点数)。

于 2012-07-12T16:46:53.393 回答