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 somethings são doubles.)

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.

Foi útil?

Solução

Muitos desses static_casts 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top