Qual é a maneira mais perfeita para dividir dois valores integrais e obter um quociente de ponto flutuante em .NET?

StackOverflow https://stackoverflow.com/questions/283377

Pergunta

Considere o seguinte assinatura em C #:

double Divide(int numerator, int denominator);

Existe uma diferença de desempenho entre as seguintes implementações?

return (double)numerator / denominator;

return numerator / (double)denominator;

return (double)numerator / (double)denominator;

Estou assumindo que ambos acima retornar a mesma resposta.

Eu perdi qualquer outra solução equivalente?

Foi útil?

Solução

Você já tentou comparar a IL (por exemplo, com refletor )?

static double A(int numerator, int denominator)
{ return (double)numerator / denominator; }

static double B(int numerator, int denominator)
{ return numerator / (double)denominator; }

static double C(int numerator, int denominator)
{ return (double)numerator / (double)denominator; }

Todos os três tornam-se (dar ou tomar o nome):

.method private hidebysig static float64 A(int32 numerator, int32 denominator) cil managed
{
    .maxstack 8
    L_0000: ldarg.0 // pushes numerator onto the stack
    L_0001: conv.r8 // converts the value at the top of the stack to double
    L_0002: ldarg.1 // pushes denominator onto the stack
    L_0003: conv.r8 // converts the value at the top of the stack to double
    L_0004: div     // pops two values, divides, and pushes the result
    L_0005: ret     // pops the value from the top of the stack as the return value
}

Portanto, não:. Não é exatamente zero diferença

Outras dicas

Mesmo se você usar VB.NET, tanto numerador e denominador são convertidos em duplas antes de fazer a divisão real, para que seus exemplos são os mesmos.

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