Вот исходники
#include <stdio.h>
#define BITS 10 // 0<=BITS<=16
unsigned int i0=0, i1=0;
int f(unsigned int arg)
{
if( ( (arg>>16) & ((1<<BITS)-1) ) == 0 )
return 1; // exception
else
++i0; // do some good work here, i.e. increment i0
return 0; // ok
}
int main()
{
unsigned int i=0, x=1;
do {
++i;
x+=x<<2; // x == 5 power i
if( f(x) )
++i1; // exception
}
while(x!=1);
printf("i=%u i0=%u i1=%u i0+i1=%u\n", i,i0,i1,i0+i1 );
printf(" %u %u %u %u\n", 0x40000000u, i-i1, (1<<(16-BITS))<<14, 0x40000000u );
return 0;
}
#include <stdio.h>
#define BITS 10 // 0<=BITS<=16
unsigned int i0=0, i1=0;
class E1 {};
E1 e1;
void f(unsigned int arg)
{
if( ( (arg>>16) & ((1<<BITS)-1) ) == 0 )
throw &e1;
else
++i0; // do some good work here, i.e. increment i0
}
int main()
{
unsigned int i=0, x=1;
do {
++i;
x+=x<<2; // x == 5 power i
try{ f(x); }
catch( E1* e ){ ++i1; }
}
while(x!=1);
printf("i=%u i0=%u i1=%u i0+i1=%u\n", i,i0,i1,i0+i1 );
printf(" %u %u %u %u\n", 0x40000000u, i-i1, (1<<(16-BITS))<<14, 0x40000000u );
return 0;
}
Вот выхлопы [ gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) ]:
$ gcc -O3 1.c && time ./a.out
i=1073741824 i0=1072693248 i1=1048576 i0+i1=1073741824
1073741824 1072693248 1048576 1073741824
real 0m2.368s
user 0m2.256s
sys 0m0.004s
$ g++ -O3 1.cxx && time ./a.out
i=1073741824 i0=1072693248 i1=1048576 i0+i1=1073741824
1073741824 1072693248 1048576 1073741824
real 0m11.741s
user 0m10.921s
sys 0m0.008s
Кто сможет протестить на icc, других версиях gcc и других железках? Возможно, я не указал полезные опции? А дальше флейм :-)