6

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

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<double>(1)

等等,但似乎我可以少打很多字。

我不明白什么?

提前致谢。

4

3 回答 3

7

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

于 2011-03-23T22:19:15.100 回答
2

我同意前面的答案,2.0这里会好得多。

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

于 2011-03-23T22:27:31.293 回答
1

这相当于更具可读性

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

因为每当算术运算有一个双操作数时,整数都会被提升为双精度数。0.5 double litteral 足以推动一切翻倍。

于 2011-03-23T22:33:44.537 回答