Por que se dar ao trabalho de static_cast -ing um número para o dobro?
-
29-10-2019 - |
Pergunta
Encontrei isso no código em que estou trabalhando:
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 );
(Os something
s são double
s.)
Eu suspeito que há um bom motivo para se dar ao trabalho de fazer
static_cast<double>(1)
e assim por diante, mas parece que eu poderia sobreviver com muito menos digitação.
O que não estou entendendo?
Agradecemos antecipadamente.
Solução
Muitos desses static_cast
s são desnecessários, devido à promoção numérica automática.Os que são extremamente necessários são aqueles usados na construção do número 1/2, embora neste caso não haja nenhuma razão óbvia para não dizer apenas 0.5
em vez disso.Em qualquer caso, um compilador que está prestando atenção irá remover tudo isso e substituí-los por constantes de tempo de compilação.
Outras dicas
Concordo com a resposta anterior de que 2.0
seria muito melhor aqui.
No entanto, encontrei outro sinalizador vermelho no código, a saber, pow(something, 3)
.A função pow
é projetada para pegar dois valores arbitrários, x e y , e retornar x ^ y .Como essa função deve lidar com valores arbitrários, ela fará uma aproximação.No entanto, este 1) é complexo de calcular e 2) às vezes não acerta.Nesse caso, seria muito melhor simplesmente usar something4 * something4 * something4
.
Isso é equivalente a muito mais legível
double part2 = 2 * somthing1 * (1 + something2)
+ 0.5 * something3 + 0.5 * something4 * something4 * something4
já que os inteiros são promovidos a duplos sempre que uma operação aritmética tem um operando duplo.O 0,5 duplo litro é suficiente para fazer tudo dobrar.