【问题标题】:Proper initialization of a double using a fraction?使用分数正确初始化双精度?
【发布时间】:2016-11-17 12:19:08
【问题描述】:

考虑以下代码:

double foo;
foo = 1/35;

然后foo 将等于0.02857142857(大约为十进制的1/35)还是0(整数除法)?这段代码是否可移植,换句话说,它是否已定义、保证行为,即在将 1/35 之类的东西分配给 double 时会执行浮点除法?

【问题讨论】:

  • 它将产生一个零作为整数......你正在划分整数并且denom比分子更大
  • "那么 foo 是否等于..." 你不能测试一下吗?
  • 结果将为 0。您需要将其中一个操作数转换为 double。
  • 尽管有标题,但这段代码没有进行初始化。这是一个作业double foo = 1/35; 将是初始化。

标签: c++ floating-point variable-assignment


【解决方案1】:

您的代码正在执行整数除法(它的右手)。 为确保您进行正确的双重除法,除数和除数之一必须是双重的。

您可以使用以下方法修复它:

foo = 1d/35;

【讨论】:

  • foo = 1.0/35 会是一个有效的替代方案吗?
  • @space_voyager 它在 C# 中(Console.WriteLine(1.0.GetType().ToString()) 输出双倍)所以我认为它也可以在 C++ 中。如果便携性是一个问题,我会坚持使用“d”后缀。
  • 这个问题专门针对 c++。恕我直言,提到 c 或其他语言会误导人们认为“在 C 中有效的东西必须在 C++ 中有效”,而这通常不是真的
  • 1.0 是可移植的。根据标准,没有像1.0 这样的限定符的浮点文字是double1.0f 将改为 float
  • 1.0 1.0e0 1e0 都是合法的 C 和 C++。 1d 不在这两个标准中(除非它是最近添加的 - 类型的合法后缀是 f F l L - 不是双精度的“d”)。
猜你喜欢
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多