2008-11-12 4 views

Répondre

5

Avez-vous essayé de comparer l'IL (par exemple, avec 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; } 

Tous trois deviennent (donner ou prendre le nom):

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

donc pas: il est exactement la différence zéro.

1

Même si vous utilisez VB.NET, le numérateur et le dénominateur sont convertis en double avant d'effectuer la division proprement dite, de sorte que vos exemples sont les mêmes.

Questions connexes