我问是因为我使用的是 Box2D 库,它主要需要浮点参数。尽管我看到很多使用0.00f格式的示例代码,但我不太确定它与普通的旧0.00之间是否存在实际差异。
以后不附加额外的f会伤害自己吗?是速度问题吗?是否有某种内涵需要f加数而其他人不需要?
TL;DR:为什么我应该使用 0.00f 而不是 0.00?
我问是因为我使用的是 Box2D 库,它主要需要浮点参数。尽管我看到很多使用0.00f格式的示例代码,但我不太确定它与普通的旧0.00之间是否存在实际差异。
以后不附加额外的f会伤害自己吗?是速度问题吗?是否有某种内涵需要f加数而其他人不需要?
TL;DR:为什么我应该使用 0.00f 而不是 0.00?
f
后缀使其成为单精度(浮点)文字而不是双精度文字。这通常意味着 32 位而不是 64 位浮点数。
浮点常量默认为 double 类型。通过使用后缀 f 或 l(或 F 或 L — 后缀不区分大小写),可以分别将常量指定为 float 或 long double。
http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=VS.100).aspx
它们是有区别的。2.00
有类型double
和2.00f
有类型float
。确切的精度和格式含义取决于您的平台。使用其中一个是否会在您的代码中产生实际差异取决于使用它的上下文。
作为显式类型变量(基本数字类型)的初始化器,没有区别,但是在函数调用中使用时,它可能会影响使用哪个重载或模板特化。
auto
显然,当在使用类型说明符的声明中用作初始化器或用作 decltype-说明符中的表达式时,正在声明的对象的类型将受到影响。
decltype(2.00) x = 2.00f; // confusing
decltype(2.00f) y = 2.00; // also confusing
auto d = 2.00;
auto f = 2.00f;
只要您将它们分配给 a float
,就绝对没有区别,因为该值可以在所有数字类型中精确且正确地表示。
重要的区别是文字的类型,即double
for 2.0
、float
for2.0f
和int
for 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);
的类型2.00
是double
,的类型2.00f
是float
。
后缀f
将文字2.00
转换为浮点类型,从而降低其精度。否则,字面量就是double
类型。
默认假设是double
。指定f
后缀确保它将被解释为float
后缀会影响类型,从而改变语句的解析方式。正如其他人所说,这不仅改变了通过和函数重载选择的类型推导结果,而且改变了表达式的评估方式decltype
例如2.0 * x / 3
以双精度2.0f * x / 3
完成,当 x 为double
或时以浮点精度完成float
。这可能会导致不同的结果,因为更高的精度会减少任何中间误差。在这里,我假设FLT_EVAL_METHOD
宏已设置为不会以更高的精度评估浮点类型。但即使FLT_EVAL_METHOD >= 1
那样,结果在有和没有后缀的情况下可能仍然不同,因为下一点:
后缀也会影响值。在 C++ 中,该值必须正确舍入到目标类型中最接近的值。所以例如当我们有
float f1=8388609.499999999068677425384521484375f;
float f2=8388609.499999999068677425384521484375;
thenf1
和f2
会有不同的值,因为后缀防止在(decimal → double → float)中发生双舍入。十进制值不经过直接f2
四舍五入到最接近的值float
double
看