Округленческое: результаты
Dec. 18th, 2014 03:28 pmРасслабился народ, не хочет этюд для программистов исполнять.
Компилируем (для x86_64), запускаем и наслаждаемся результатами, обнаруживая, что для каждого параметра найдется хотя бы один случай, когда этот параметр влияет на результат.
Итого 8 разных вариантов.
Потом компилируем, запрещая SSE, запускаем и наслаждаемся результатами еще раз (это уж сами; попробуйте сначала угадать, что будет).
#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, запускаем и наслаждаемся результатами еще раз (это уж сами; попробуйте сначала угадать, что будет).
no subject
Date: 2014-12-20 12:58 am (UTC)no subject
Date: 2014-12-20 01:00 am (UTC)