Zrobiłem taki prowizoryczny test (na 32-bitowym kompilatorku - Borlanda):
#define N 1000
uint f[8];
double *t = new double[N];
QueryPerformanceFrequency((LARGE_INTEGER*)(f+0));
for(int k = 0; k < 3; k++)
{
for(int i = 0; i < N; i++) t[i] = rndf()*100;
QueryPerformanceCounter((LARGE_INTEGER*)(f+2));
for(int i = 0; i < N; i++) roundf(t[0], 2);
QueryPerformanceCounter((LARGE_INTEGER*)(f+4));
for(int i = 0; i < N; i++) roundfi(t[0], 2);
QueryPerformanceCounter((LARGE_INTEGER*)(f+6));
}
delete t;
int t1 = f[4]-f[2];
int t2 = f[6]-f[4];
sprintf(s, "%d / %d = %f", t1, t2, (double)t1/t2);
MessageBox(s, "round", MB_OK);
i dla n=2 wynik był około 0.3, czyli 3.33 razy szybciej z fmod.
dla n = 3, i 4 było okóło 0.5;
a dla n = 0 było to samo, czyli głównie ten pow to spowalnia.
Borland kompiluje floaty na FPU,
a wtedy fmod używa rozkazu fprem, który jest ponoć wolny...
więc na SSE2 powinno być szybciej.
Może jeszcze na MS C++ to sprawdzę..