在 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】:
如果a
是int
,那么这两行肯定不等价:
float b = 3.0f * a; 浮动 b = 3 * a;
如果a
太大,第二个将静默溢出,因为右侧是使用整数算术计算的。但第一个是完全安全的。
但如果a
是float
,如您的示例所示,那么这两个表达式是等价的。您使用哪一个是个人喜好的问题;第一个可能更卫生。
【讨论】:
【参考方案3】:这在某种程度上取决于您对数字的处理方式。带有f
或F
的浮点文字的类型是float
类型。没有后缀的浮点字面量的类型是double
。因此,使用f
后缀与不使用它可能会有细微差别。
只要子表达式涉及至少一个浮点类型的对象,它可能就没有多大关系。更重要的是使用带有整数的后缀来解释为浮点:如果子表达式中不涉及浮点值,则使用整数算术。这可能会产生重大影响,因为结果将是一个整数。
【讨论】:
为什么使用 3.0f,而 3.0 工作得很好?我非常怀疑 float 和 double 之间的转换不是微不足道的。 @Drise:因为(在许多平台上)转换并不简单,而且双精度算术比单精度慢。 使用float
算术的结果可能与使用double
算术的结果不同。是否比另一个快是一个单独的问题并且难以预测:许多浮点单元使用double
甚至long double
而不是float
进行计算,而例如,典型的向量运算确实使用float
。即使在计算之前将float
转换为double
,结果也可能不同,尽管在示例3.0
中没有,因为该值是精确表示的。但是,在表达式中使用 0.1f
与 0.1
可能会产生不同的结果。【参考方案4】:
float b = 3.0f * a;
有时这样做是因为您想确保将 3.0 创建为浮点数而不是双精度数。
【讨论】:
@Drise 我认为没有人在我之前说过...另外,对你来说显而易见的事情对每个人来说并不明显。 @Drise 你抓住了我。我看到了你的评论,并用我的时间机器回到了 9 分钟来发布我的答案。我为自己感到羞耻。以上是关于在 C++ 中对浮点变量执行算术运算时是不是总是需要使用浮点文字?的主要内容,如果未能解决你的问题,请参考以下文章