spamsink: (Default)
[personal profile] spamsink
Расслабился народ, не хочет этюд для программистов исполнять.


#include <cstdio>

template< class Div, class Quot, class Mult, class Res > void Rounding(const char * s) {
        volatile Quot quot;
        volatile Res res;
        int less = 0, greater = 0;
        for (int i = 3; i <= 1000001; i += 2) {
                quot = (Div)1.0 / i;
                res = (Mult)quot*i;
                if (res < 1.0) ++less;
                else if (res > 1.0) ++greater;
        }
        printf("%s: Less = %.3f%%, Greater = %.3f%%\n", s, less/5000.0, greater/5000.0);
}

typedef double D;
typedef long double L;

#define r(a,b,c,d) Rounding< a,b,c,d > (#a#b#c#d)

main() {
    r(D,D,D,D);
    r(D,D,D,L);
    r(D,D,L,D);
    r(D,D,L,L);
    r(D,L,D,D);
    r(D,L,D,L);
    r(D,L,L,D);
    r(D,L,L,L);
    r(L,D,D,D);
    r(L,D,D,L);
    r(L,D,L,D);
    r(L,D,L,L);
    r(L,L,D,D);
    r(L,L,D,L);
    r(L,L,L,D);
    r(L,L,L,L);
}


Компилируем (для x86_64), запускаем и наслаждаемся результатами, обнаруживая, что для каждого параметра найдется хотя бы один случай, когда этот параметр влияет на результат.
DDDD: Less = 14.857%, Greater = 0.000%
DDDL: Less = 14.857%, Greater = 0.000%
DDLD: Less = 14.840%, Greater = 0.000%
DDLL: Less = 50.026%, Greater = 49.893%
DLDD: Less = 14.857%, Greater = 0.000%
DLDL: Less = 14.857%, Greater = 0.000%
DLLD: Less = 14.840%, Greater = 0.000%
DLLL: Less = 50.026%, Greater = 49.893%
LDDD: Less = 14.867%, Greater = 0.000%
LDDL: Less = 14.867%, Greater = 0.000%
LDLD: Less = 14.850%, Greater = 0.000%
LDLL: Less = 50.036%, Greater = 49.882%
LLDD: Less = 14.867%, Greater = 0.000%
LLDL: Less = 14.867%, Greater = 0.000%
LLLD: Less = 0.000%, Greater = 0.000%
LLLL: Less = 14.881%, Greater = 0.000%

Итого 8 разных вариантов.

Потом компилируем, запрещая SSE, запускаем и наслаждаемся результатами еще раз (это уж сами; попробуйте сначала угадать, что будет).

Date: 2014-12-20 12:58 am (UTC)
From: [identity profile] dvv.livejournal.com
Меня больше прикалывает, как наличие/отсутствие volatile на результаты сказывается.
Page generated Mar. 6th, 2026 02:58 pm
Powered by Dreamwidth Studios