Modifica la modalità di arrotondamento in virgola mobile

Qual è il modo più efficiente per modificare la modalità di arrotondamento * dei numeri a virgola mobile IEEE 754? Una funzione C portatile sarebbe carina, ma una soluzione che usa l’assembly x86 va bene anch’essa.

* Mi riferisco alle modalità di arrotondamento standard verso il più vicino, verso lo zero e verso l’infinito positivo / negativo

Questa è la soluzione C standard:

#include  #pragma STDC FENV_ACCESS ON // store the original rounding mode const int originalRounding = fegetround( ); // establish the desired rounding mode fesetround(FE_TOWARDZERO); // do whatever you need to do ... // ... and restore the original mode afterwards fesetround(originalRounding); 

Su piattaforms all’indietro prive del supporto C99, potrebbe essere necessario ricorrere all’assemblaggio. In questo caso, è ansible impostare l’arrotondamento per l’unità x87 (tramite l’istruzione fldcw ) e SSE (tramite l’istruzione ldmxcsr ).

Modifica Non è necessario ricorrere all’assembly per MSVC. È ansible utilizzare invece (totalmente non standard) _control_fp( ) :

 unsigned int originalRounding = _control_fp(0, 0); _control_fp(_RC_CHOP, _MCW_RC); // do something ... _control_fp(originalRounding, _MCW_RC); 

Puoi leggere ulteriori informazioni su _control_fp () su MSDN .

E, solo per completezza, un decodificatore per i nomi delle macro per le modalità di arrotondamento:

 rounding mode C name MSVC name ----------------------------------------- to nearest FE_TONEAREST _RC_NEAR toward zero FE_TOWARDZERO _RC_CHOP to +infinity FE_UPWARD _RC_UP to -infinity FE_DOWNWARD _RC_DOWN 

questo potrebbe aiutare.

Edit: Direi che avresti bisogno della tua funzione. È ansible utilizzare l’assemblaggio all’interno di C.

Ma se la dimensione della registrazione è 64 bit, arrotondarla a 32 bit renderebbe i calcoli più veloci. In realtà lo renderà più lento. Ricorda i calcoli a 64 bit è facile per un microprocessore 64 piuttosto che 2-32 bit. Non so esattamente cosa vuoi ottenere. So che le prestazioni dipendono dai tuoi criteri.