【问题标题】:Should I initialize a floating-point (double,float) variable with 0 or 0.0?我应该用 0 还是 0.0 初始化浮点(double,float)变量?
【发布时间】:2019-12-17 16:50:19
【问题描述】:

我的问题是: 我应该用0 还是0.0 初始化像doublefloat 这样的浮点变量(当然,如果我想用等于0 的值来初始化它)?

例如:

double var = 0.0;

对比:

double var = 0;

这有什么不同吗?


问题对 C 和 C++ 开放,因为我同时使用两者并且不想两次提出相同的问题。如果这两者在特别是这种情况下存在显着差异,请说明您关注的是哪种语言。

由于对 C++ 的一半关注,构造函数的情况也可能成为对该主题的影响,当然初始化通常是 C++ 中的一个更广泛的主题,但我不知道这是否会影响答案.

非常感谢。

【问题讨论】:

  • 它没有任何区别,但可能会向读者展示意图。
  • 两个都试一下,看看生成的代码,看看它有什么(如果有的话)不同。
  • 在这种情况下没有区别。也就是说,如果你有类似std::vector<double> foo = stuff; std::accumulate(foo.begin(), foo.end(), 0); 的东西,它会产生很大的不同,因为现在accumulate 使用int 而不是double。因此,使用与类型匹配的字面量应该会减少问题。
  • @Someprogrammerdude 这是个坏建议。仅仅因为特定的编译器以一种方式生成代码并不意味着标准要求它是这种方式。
  • @NathanOliver-ReinstateMonica 实际上我本来希望标准能够提供这些......但我认为 unsigned long n = 7 优于 auto n = 7ul(我之前的最后一个例子)。

标签: c++ c floating-point initialization ieee-754


【解决方案1】:

作为@NathanOliver cmets,在这种情况下并没有什么不同。但总是说出你的意思是一个好习惯:

double var = 0.0;

这种习惯会得到回报的地方是std::accumulate

std::vector<double> v{1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, 10.1};

double sum = std::accumulate(v.begin(), v.end(), 0);  // 0 here is wrong!

这不会起作用,因为std::accumulate 被声明为:

template< class InputIt, class T >
constexpr T accumulate( InputIt first, InputIt last, T init );

所以0 导致T 成为int

【讨论】:

  • 恭喜您找到了存在实际差异的用例。
  • @MarkRansom 艰难地找到了它,从那以后我一直很努力地处理我的0s 和0.0s! :--)
  • 嗯,实际上,Nathan 挖掘它的速度要快一些(见 cmets 的问题)——所以他的桂冠?
  • @Aconcagua 是的,他在我回答之前发表了评论,但老实说,这是我想到的第一件事。
  • @NathanOliver-ReinstateMonica 完全正确!它应该使用迭代器value_type
【解决方案2】:

你可以像这样初始化一个双精度:

double test = 0.0;

但是,如果您想 100% 正确地进行初始化,则必须像这样初始化浮点数:

float test = 0.0f;

f 表示它前面的数字是浮点数。如果您忽略它,该数字将被解释为双精度并自动转换回浮点数,因为您的变量是浮点类型。离开f 不会造成任何真正的麻烦,但会引入不必要的开销。我相信当你用 0 而不是 0.0 初始化一个 double 时会发生类似的事情,但我不确定这部分。

【讨论】:

  • 开销?至少不是在运行时,转换已经在编译时完成;不过,编译器内部会发生什么我不知道......
  • @Anteino 非常感谢您的回答,Anteino。我不知道浮点值会自动解释为double 值,也不知道有使用格式说明符尾随数字常量的约定。你有这方面的参考吗?也许标准中的相应部分?那太好了。
  • 嘿伙计,谢谢,没问题。一位老师在一次讲座中告诉我这件事。如果找不到,我会尝试找到参考资料或向他询问。
  • 你不需要付出这么大的努力。我不想骚扰你。无论如何,非常感谢您的帮助和提示。我也会继续研究,;-) 非常感谢。
  • 不,没关系,现在我想知道。我的教授说他不确定是否在编译时引入了这种开销。为此,我将不得不检查汇编代码。当我发现更多信息时,我会编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2015-02-12
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多