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