http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57073



--- Comment #3 from Thomas Koenig <tkoenig at gcc dot gnu.org> 2013-04-28 
09:05:31 UTC ---

(In reply to comment #1)

> Modulo is an integer only operation, so I'd say you want

> (k & 1) ? -1.0 : 1.0

> instead, converting (k & 1) into floating point and multiplying and 
> subtracting

> it or (k & 1) << 1 into floating point and subtracting it is is likely going 
> to

> be more expensive, though of course it should be benchmarked.



You're right, it is much faster:



g25@linux-fd1f:~/Krempel/P2> cat a.c

#include <stdio.h>



volatile float b;



int main()

{

  int i;

  for (i=0; i<1000000000; i++)

    b = (i & 1) ? -1.0 : 1.0;



  printf("%f\n",b);

}

ig25@linux-fd1f:~/Krempel/P2> gcc -O a.c && time ./a.out

-1.000000



real    0m1.948s

user    0m1.946s

sys     0m0.000s

ig25@linux-fd1f:~/Krempel/P2> cat b.c

#include <stdio.h>



volatile float b;



int main()

{

  int i;

  for (i=0; i<1000000000; i++)

    b = 1.0 - ((i&1)<<1);



  printf("%f\n",b);

}

ig25@linux-fd1f:~/Krempel/P2> gcc -O b.c && time ./a.out

-1.000000



real    0m7.059s

user    0m7.053s

sys     0m0.001s

Reply via email to