2008-11-12 17 views
1

Рассмотрим следующую сигнатуру в C#:Какой самый эффективный способ разделить два интегральных значения и получить коэффициент с плавающей запятой в .NET?

double Divide(int numerator, int denominator); 

Есть ли разница в производительности между следующими реализациями?

return (double)numerator/denominator; 

return numerator/(double)denominator; 

return (double)numerator/(double)denominator; 

Я предполагаю, что оба вышеупомянутых возвращают тот же ответ.

Я пропустил какое-либо другое эквивалентное решение?

ответ

5

Вы пытались сравнить ИЛ (например, с Reflector)? не

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

Все три стали (дать или принять имя):

.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 
} 

Так нет: есть ровно ноль разница.

1

Даже если вы используете VB.NET, и числитель, и знаменатель преобразуются в парные разряды перед выполнением фактического деления, поэтому ваши примеры одинаковы.

 Смежные вопросы

  • Нет связанных вопросов^_^