Вот исходники
#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 и других железках? Возможно, я не указал полезные опции? А дальше флейм :-)








