Зачем переживать проблему статического_кастинга - число удваивается? - PullRequest
6 голосов
/ 24 марта 2011

Наткнулся на это в коде, через который я работаю:

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 );

(something s double s.)

I подозреваемый что есть действительно веская причина для того, чтобы справиться с трудностями

static_cast<double>(1)

и т. п., но кажется, что я мог бы справиться с этим гораздо реже.

Что я не понимаю?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 24 марта 2011

Многие из этих static_cast не нужны из-за автоматического числового продвижения.Крайне необходимыми являются те, которые используются при построении числа 1/2, хотя в этом случае нет очевидной причины не просто сказать 0.5.В любом случае обращающий внимание компилятор удалит все это и заменит их константами времени компиляции.

2 голосов
/ 24 марта 2011

Я согласен с предыдущим ответом, что 2.0 будет намного лучше здесь.

Однако я нашел еще один красный флаг в коде, а именно pow(something, 3). Функция pow предназначена для получения двух произвольных значений: x и y и возврата x ^ y . Поскольку эта функция должна обрабатывать произвольные значения, она выполнит приближение. Однако это 1) сложно рассчитать и 2) иногда пропустить оценку. В этом случае вам будет гораздо удобнее просто использовать something4 * something4 * something4.

1 голос
/ 24 марта 2011

Это эквивалентно гораздо более читаемому

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

, поскольку целые числа повышаются до двойных каждый раз, когда арифметическая операция имеет один двойной операнд.0,5 двойного литерала достаточно, чтобы все удвоилось.

...