Effizienzfrage: 1/4 oder 0.25



  • Ist es eigentlich effizienter anstatt von

    foo * 5 * 1/4;
    

    sofort

    foo * 5 * 0.25
    

    zu schreiben, da der Rechenschritt eins geteilt durch vier ja nicht mehr extra berechnet werden muss?
    Oder ist es aufgrund von Compileroptimierung sowieso Latte?



  • Ich hoffe mal für die Compiler-Bauer, das es latte ist! 😃 Wehe der Compiler rechnet das nicht schon zur Compilezeit aus! 😡



  • genau genommen kommt bei

    foo * 5 * 1/4
    

    was anderes raus als bei

    foo * 5 * .25
    

    da für den Compiler 1/4 = 0 ist (Hallo Integer)

    grüße, Con@n



  • Con@n schrieb:

    da für den Compiler 1/4 = 0 ist

    Somit ist natuerlich ganz klar
    foo * 5 * 1/4;
    schneller, weil das ohne probleme zu
    0
    optimierbar ist.



  • Na ja,

    das hängt jetzt davon ab, welchen Wert foo hat.

    Wenn foo ausgerechnet 42 ist, dann kann der Compiler schon eine Weile brauchen. So ca. 7 1/2 Millionen Jahre 😃

    Don't Panic, Con@n



  • Somit ist natuerlich ganz klar
    foo * 5 * 1/4;
    schneller, weil das ohne probleme zu
    0
    optimierbar ist.

    Wieso nimmst du einfach an, foo sei von einem ganzzahligen Typ? Es könnte doch auch den Typ float oder double haben und NaN mal irgendwas ist immer NaN.



  • foo * 5 * 1/4;
    
    foo * 5 * 0.25
    

    ersteres ist stets equivalent zu

    foo * 5 / 4;
    

    wenn foo ein integer typ ist, dann sind das zwei völlig verschiedene sachen.

    wenn float dagegen irgend ein gleitkommatyp ist, dann wäre es in diesem falle möglich, dass der compiler /4 durch *0.25 (oder *0.25f wenn foo vom typ float ist) ersetzt, weil es keine rundungsfehler irgendwelcher art erzeugt, und daher equivalent ist. auf keinen fall darf der compiler das ganze zu

    foo * 1.25;
    

    machen, dann das ist etwas völlig anderes.

    etwas anderes wäre

    5.0 / 4 * foo;
    

    bzw.

    5 * 0.25 * foo;
    

    hier darf (und wird) der compiler die konstanten zusammenfassen.



  • ich hab so das gefühl, dass er/sie einfach nur wissen wollte, ob eine multiplikation oder eine division schneller is, kann das sein?



  • KennyMcCormick schrieb:

    ich hab so das gefühl, dass er/sie einfach nur wissen wollte, ob eine multiplikation oder eine division schneller is, kann das sein?

    Ne Multiplikation ist normalerweise schneller, aber bei Konstanten ist es wie gesagt latte.



  • Hmm,
    da 4 'ne Zweierpotenz ist, ersetzt der Compiler die Division (foo*5/4) durch ein ShiftRight (sar oder shr). Natürlich nur, wenns Sinn macht, und foo keine Konstante ist. 🙂

    const int bar=foo*5/4;
     mov         eax,dword ptr [foo] 
     imul        eax,eax,5  
     cdq              
     and         edx,3 
     add         eax,edx 
     sar         eax,2 
     mov         dword ptr [bar],eax
    

    _Aber_, zumindest der Studio7.1 Compiler, erkennt nicht, dass 0.25f=1/4f ist.

    const int bar=foo*5*0.25f;
    mov         eax,dword ptr [foo] 
    imul        eax,eax,5 
    cvtsi2ss    xmm0,eax 
    mulss       xmm0,dword ptr [__real@3e800000 (60CB38h)] 
    cvttss2si   ecx,xmm0 
    mov         dword ptr [bar],ecx
    

    Die Division ist dem Fall tatsächlich schneller.[1]

    Gruß

    [1] Wenn man mal 1/4=0 ausschließt.... 😉


Anmelden zum Antworten