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, запускаем и наслаждаемся результатами еще раз (это уж сами; попробуйте сначала угадать, что будет).
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting
Page generated Mar. 7th, 2026 06:13 am
Powered by Dreamwidth Studios