在 C++ 中对浮点变量执行算术运算时是不是总是需要使用浮点文字?

Posted

技术标签:

【中文标题】在 C++ 中对浮点变量执行算术运算时是不是总是需要使用浮点文字?【英文标题】:Is it always necessary to use float literals when performing arithmetic on float variables in C++?在 C++ 中对浮点变量执行算术运算时是否总是需要使用浮点文字? 【发布时间】:2012-09-21 18:00:10 【问题描述】:

我看到很多 C++ 代码的行如下:

float a = 2;
float x = a + 1.0f;
float b = 3.0f * a;
float c = 2.0f * (1.0f - a);

这些文字后面的.0f 真的有必要吗?如果省略这些,您会失去数字准确性吗?

我认为只有当你有这样的一行时你才需要它们:

float a = 10;
float x = 1 / a;

你应该在哪里使用1.0f,对吧?

【问题讨论】:

我几乎可以肯定这是重复的。 ***.com/q/4353780/868546 在列出的六个示例中,您都不需要.0f。在每种情况下,整数文字都将被提升为浮点类型。 如你所说;有时它们是必要的,有时它们不是(尽管在您的任何示例中它们都不是必需的;float x = 1/10 是它们何时需要的示例)。在我看来,使用它们更容易,而不是考虑是否需要它们。 我认为你会降低性能,因为默认情况下 FP 常量是双倍的。 agner.org/optimize/optimizing_cpp.pdfchapter:14.7 不要混用float和double @NoSenseEtAl:如果你使用像1.0 这样的双精度文字,你只会得到双精度算术。在与另一个 float 进行算术运算时,像 1 这样的整数文字将被提升为 float 【参考方案1】:

您需要在以下情况下使用它:

float x = 1/3;

1 或 3 都需要有 .0,否则 x 将始终为 0。

【讨论】:

但是如果在方程中的某处使用了浮点变量,那么它影响的部分将是安全的,对吧? 任何浮点文字 (3.0) 都是 double 类型,所以如果有的话,当它转换为浮点数时,你会在 3.0 上失去一些精度。那,或者浮点数被转换为双精度,并且没有精度丢失。 @JoanVenge:不,在等式中的某处有一个浮点变量是不够的。例如,如果 y 是浮点数,那么 float x = y + 1/3; 仍然是错误的。 1/3 首先被评估。两个操作数都是整数,所以使用整数算术。得到结果后,再与y相加。到那时,有转换成float,但为时已晚。 @Eric:谢谢,这就是我想说的影响力,但就像你说的那样。不确定是否有一个词,但我也在逐个查看是否需要使用.0f【参考方案2】:

如果aint,那么这两行肯定不等价:

float b = 3.0f * a; 浮动 b = 3 * a;

如果a 太大,第二个将静默溢出,因为右侧是使用整数算术计算的。但第一个是完全安全的。

但如果afloat,如您的示例所示,那么这两个表达式是等价的。您使用哪一个是个人喜好的问题;第一个可能更卫生。

【讨论】:

【参考方案3】:

这在某种程度上取决于您对数字的处理方式。带有fF 的浮点文字的类型是float 类型。没有后缀的浮点字面量的类型是double。因此,使用f 后缀与不使用它可能会有细微差别。

只要子表达式涉及至少一个浮点类型的对象,它可能就没有多大关系。更重要的是使用带有整数的后缀来解释为浮点:如果子表达式中不涉及浮点值,则使用整数算术。这可能会产生重大影响,因为结果将是一个整数。

【讨论】:

为什么使用 3.0f,而 3.0 工作得很好?我非常怀疑 float 和 double 之间的转换不是微不足道的。 @Drise:因为(在许多平台上)转换并不简单,而且双精度算术比单精度慢。 使用float 算术的结果可能与使用double 算术的结果不同。是否比另一个快是一个单独的问题并且难以预测:许多浮点单元使用double 甚至long double 而不是float 进行计算,而例如,典型的向量运算确实使用float。即使在计算之前将float 转换为double,结果也可能不同,尽管在示例3.0 中没有,因为该值是精确表示的。但是,在表达式中使用 0.1f0.1 可能会产生不同的结果。【参考方案4】:
float b = 3.0f * a; 

有时这样做是因为您想确保将 3.0 创建为浮点数而不是双精度数。

【讨论】:

@Drise 我认为没有人在我之前说过...另外,对你来说显而易见的事情对每个人来说并不明显。 @Drise 你抓住了我。我看到了你的评论,并用我的时间机器回到了 9 分钟来发布我的答案。我为自己感到羞耻。

以上是关于在 C++ 中对浮点变量执行算术运算时是不是总是需要使用浮点文字?的主要内容,如果未能解决你的问题,请参考以下文章

C++指针的算术运算 关系运算

C++算术运算符

C++算术运算符

00007_运算符

为啥在 C 和 C++ 中的算术运算之前必须将 short 转换为 int?

在 C++ 中对布尔值使用位运算符