在 C++ 中始终使用后缀“f”作为浮点数有什么好处?
一方面我的代码变得一团糟,我的意思是我有很多数学公式,想象一下,而不是简单地写 1,而是写 1.0f。它会使代码混乱。
但我想知道这方面是否有优化或其他方面?
谢谢
在 C++ 中始终使用后缀“f”作为浮点数有什么好处?
一方面我的代码变得一团糟,我的意思是我有很多数学公式,想象一下,而不是简单地写 1,而是写 1.0f。它会使代码混乱。
但我想知道这方面是否有优化或其他方面?
谢谢
有时它变得必要。
考虑这个函数模板:
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自己查看错误。
请注意 的 类型1
是int
和1.0
是double
而1.0f
是float
。
编译器几乎可以肯定地计算出来,因此没有运行时性能损失。
明确的原因是避免编译器警告有关隐式转换,避免可能出现意外行为的转换,以及在类型推导上下文中推导特定类型或强制调用特定重载。
这是一个示例,其中源想要将值表示为分数,但由于文字类型错误而得到错误的值:
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);
^
1.0
或者1.
是一个double
常数
1.0f
是一个float
常数
它们是有区别的。
它可以消除警告。
顺便说一句,根据您的编译器,幕后浮点数被提升为 double 以进行计算。
指定 double 与 float 的另一种用途是 FORTRAN 的遗留问题,它可能会或可能不会困扰您的编译器。在过去的日子里,FORTRAN 仅以您指定的精度存储数据,将垃圾留在最后一位数字之外的未指定字节中。编码 x = 1.0 并让 x 实际上等于 1.0987659987623 是很可能的,这取决于“x”的类型(在 FORTRAN 中它是一个单精度浮点数)。