“2.00”和“2.00f”之间有功能区别吗?

Posted

技术标签:

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

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

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

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

【问题讨论】:

也许你想看看this question。 或者这个***.com/questions/2391818/… 【参考方案1】:

后缀影响类型,它会改变语句的解析方式。正如其他人所说,这不仅改变了通过decltype函数重载选择类型推导结果,而且如何评估表达式

例如,2.0 * x / 3 以双精度完成,2.0f * x / 3 在 x 为 doublefloat 时以浮点精度完成。这可能会导致不同的结果,因为更高的精度会减少任何中间误差。在这里,我假设设置了 FLT_EVAL_METHOD 宏,以便不会以更高的精度评估浮点类型。但即使FLT_EVAL_METHOD >= 1 有和没有后缀,结果可能仍然不同,因为下一点:

后缀也会影响。在 C++ 中,该值必须正确舍入到目标类型中最接近的值。例如,当我们有

float f1=8388609.499999999068677425384521484375f;
float f2=8388609.499999999068677425384521484375;

那么f1f2 将具有不同的值,因为后缀阻止double rounding 在f2 中发生(十进制→ 双精度→ 浮点型)。十进制值直接四舍五入到最接近的float值,不经过double

When does appending an 'f' change the value of a floating constant when assigned to a `float`? The type of a floating point literal with exponent Notation of double floating point values in C and C++ What's the use of suffix f on float value Is there any difference between using floating point casts vs floating point suffixes in C and C++? What is the difference between casting to `float` and adding `f` as a suffix when initializing a `float`? "i < 0.7" is true following an "float i = 0.7" initialization above?

【讨论】:

不错的总结...【参考方案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);

【讨论】:

以上是关于“2.00”和“2.00f”之间有功能区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释为啥以下查询的功能不同吗?从字面上看,两者之间的唯一区别是

公共与非功能之间的区别

原生 js defaultValue 和 jQuery prop(defaultValue) 之间有(应该有)区别吗?

反应式和功能反应式编程之间的区别

mysql和sql server的区别?性能,功能,...? [关闭]

<winsock.h> 和 <winsock2.h> 之间有区别吗?