【问题标题】:Why go through the trouble of static_cast-ing a number to a double?为什么要通过 static_cast 将数字转换为 double 的麻烦?
【发布时间】:2011-03-23 22:15:58
【问题描述】:

在我正在处理的代码中遇到了这个问题:

double part2 = static_cast<double>(2) * somthing1
  * ( static_cast<double>(1) + something2 )
  + ( static_cast<double>(1) / static_cast<double>(2) ) * something3
  + ( static_cast<double>(1) / static_cast<double>(2) ) * pow ( something4, 3 );

somethings 是 doubles。)

怀疑有一个很好的理由去经历这样做的麻烦

static_cast&lt;double&gt;(1)

之类的,但似乎我可以少打很多字。

我不明白什么?

提前致谢。

【问题讨论】:

  • 是的,输入2.02. 会简单得多。不知道为什么要转换文字。 - 人们可能也有一个错误的想法,即两个操作数需要在二元运算符调用中都是双精度数(一个就足够了)。
  • 您始终可以使用短文本:stackoverflow.com/questions/208433/… 并为变量保留显式强制转换。
  • 这是一个很好的例子,说明您应该始终编写尽可能简短和简单的代码。如果你不这样做,人们就会开始认为你没有以简单的方式输入是有原因的,他们不敢改变它。
  • @jdv,是的,这正是我的感觉。 :)

标签: c++ casting double static-cast


【解决方案1】:

其中许多static_casts 是不必要的,因为自动数字提升。非常必要的是用于构建数字 1/2 的那些,尽管在这种情况下,没有明显的理由不直接说 0.5。在任何情况下,关注的编译器都会删除所有这些并用编译时常量替换它们。

【讨论】:

  • 只做 (1.0 / 2.0) 有什么陷阱吗?这不是double 吗? (这样做的目的不仅仅是写 0.5,大概是为了与原始程序员参考的学术期刊保持平行结构。)
  • 并非如此。大多数编译器默认将其设为float,但由于数字及其商都可以精确表示,所以这并不重要。一个像样的编译器仍然会用0.5 替换(1.0 / 2.0)
  • @John: (1.0 / 2.0) 也可以正常工作,并且比到处乱扔 static_cast 有很大的可读性改进。但正如 Paul 提到的,直接使用 0.5 并没有什么太神秘的地方(至少不会比 (1.0 / 2.0) 更神秘)
  • 浮动文字的类型是double,除非后缀明确指定。
【解决方案2】:

我同意之前的回答,2.0 在这里会好很多。

但是,我在代码中发现了另一个危险信号,即pow(something, 3)pow 函数旨在获取两个任意值,xy 并返回 x^y。由于这个函数必须处理任意值,它会做一个近似值。但是,这 1) 计算起来很复杂,并且 2) 有时会错过目标。在这种情况下,您最好直接使用something4 * something4 * something4

【讨论】:

  • 感谢关于pow的警告。
【解决方案3】:

这相当于更具可读性

double part2 = 2 * somthing1 * (1 + something2)
  + 0.5 * something3 + 0.5 * something4 * something4 * something4

因为每次算术运算有一个双精度操作数时,整数都会被提升为双精度。 0.5 double litteral 足以让所有东西翻倍。

【讨论】:

  • 我认为你的回答不够充分。如果something2UINT_MAX 怎么办?试试double part2 = 2 * somthing1 * (1. + something2) + 0.5 * something3 + 0.5 * something4 * something4 * something4;
  • @Rob:因此,该更改的目的是将something2 提升为double,如果它是具有值UINT_MAXunsigned int,则会导致问题?
  • @John:是的。 1 + UINT_MAX == 0,但1.0 + UINT_MAX != 0
  • 问题是“有些东西是双打的”。所以这个答案是对的。 (虽然我个人更喜欢写 2.0 和 1.0,以防万一 something1 和 something2 的类型将来发生变化)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
相关资源
最近更新 更多