help4e
17 отговора
538 прегледа
help4e
zada4ka za C
Da se sastavi programa za namirane na proizvedenieto na 2 te nai golemi ot 3 te 4isla x y z
Da se sastavi programa za namirane na proizvedenieto na 2 te nai golemi ot 3 te 4isla x y z
Re: help4e
int mult(int *intarr) {
return (*intarr - ((*intarr - *(intarr+1)) & \
((*intarr - *(intarr+1)) >> 31))) * \
((*(intarr+2) - ((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> 31)))) &\
((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> 31)))) >> 31))));
}
тая функция я викаш като и подадеш произволен масив от int и тя пряви квото се търси с първите 3 члена. може и по-конкретно да се напише, но така изглежда много забавно...
return (*intarr - ((*intarr - *(intarr+1)) & \
((*intarr - *(intarr+1)) >> 31))) * \
((*(intarr+2) - ((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> 31)))) &\
((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> 31)))) >> 31))));
}
тая функция я викаш като и подадеш произволен масив от int и тя пряви квото се търси с първите 3 члена. може и по-конкретно да се напише, но така изглежда много забавно...
Re: help4e
смени 31 с (sizeof(int)*8-1), за да работи на различни от 32-битови машини
Re: help4e
int mult(int *intarr) {
return (*intarr - ((*intarr - *(intarr+1)) & \
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1)))) * \
((*(intarr+2) - ((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1))))) &\
((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1))))) >> (sizeof(int)*8-1)))));
}
ето спагетите са готови
return (*intarr - ((*intarr - *(intarr+1)) & \
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1)))) * \
((*(intarr+2) - ((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1))))) &\
((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1))))) >> (sizeof(int)*8-1)))));
}
ето спагетите са готови
Re: help4e
mersi mnogo
ama nqma li po-lesen na4in
tezi ne6ta o6te ne sme gi u4ili :(
ama nqma li po-lesen na4in
tezi ne6ta o6te ne sme gi u4ili :(
Re: help4e
Има и по лесен:
А на хехе начина е жесток. Но бачка само с int.
double mul3(double x, double y, double z){
return (max(x,y) == max(y,z))
?y * max(x,z)
:max(x,y) * max(y,z);
}
А на хехе начина е жесток. Но бачка само с int.
Re: help4e
що да не бачка, верно, че ще стане още по-мазало, ама става и така:
подаваш float * , после на всеки елемент
(float)(*(int *)(intarr+1)>>=31) и т.н. вече ще изглежда весело...
^+0/+2 и т.н.
ще си работи и за double, long double
подаваш float * , после на всеки елемент
(float)(*(int *)(intarr+1)>>=31) и т.н. вече ще изглежда весело...
^+0/+2 и т.н.
ще си работи и за double, long double
Re: help4e
всъщност понеже само знака е важен може и така
(float)((int)razlika>>31)
и т.н.
(float)((int)razlika>>31)
и т.н.
Re: help4e
Би ли написал твоята цяла функция за double моля, защото нямам никаква представа къде да го сложа този израз (float)((int)razlika>>31). Отделно ако функцията ти въобще работи не знам как го прави.
Re: help4e
да, след малко, сега имам малко работа. нямам готова функция, само идеята ти показах горе долу... след малко ще пейст
Re: help4e
ето:
double multd(double *intarr) {
double diff = *intarr - *(intarr+1);
long long shift = *(long long*)&diff & ((long long)diff >> (sizeof(int)*8-1));
double nestdiff = *(intarr+2) - (*(intarr + 1) + *(double *)&shift);
long long nestshift = *(long long*)&nestdiff & ((long long)nestdiff >> (sizeof(int)*8-1));
return (*intarr - *(double *)&shift) * ((*(intarr+2) - *(double *)&nestshift));
}
със сигурност може да се оптимира малко и да се поопрости, но не ми се занимава повече за сега...
double multd(double *intarr) {
double diff = *intarr - *(intarr+1);
long long shift = *(long long*)&diff & ((long long)diff >> (sizeof(int)*8-1));
double nestdiff = *(intarr+2) - (*(intarr + 1) + *(double *)&shift);
long long nestshift = *(long long*)&nestdiff & ((long long)nestdiff >> (sizeof(int)*8-1));
return (*intarr - *(double *)&shift) * ((*(intarr+2) - *(double *)&nestshift));
}
със сигурност може да се оптимира малко и да се поопрости, но не ми се занимава повече за сега...
Re: help4e
не работеше съвсем вярно:), сега вече да -
double multd(double *intarr) {
double diff = *intarr - *(intarr+1);
long long shift = *(long long*)&diff & (*(long long*)&diff >> (sizeof(long long)*8-1)); //was sizeof(int)
double nestdiff = *(intarr+2) - (*(intarr + 1) + *(double *)&shift);
long long nestshift = *(long long*)&nestdiff & (*(long long*)&nestdiff >> (sizeof(long long)*8-1));
return (*intarr - *(double *)&shift) * ((*(intarr+2) - *(double *)&nestshift));
}
double multd(double *intarr) {
double diff = *intarr - *(intarr+1);
long long shift = *(long long*)&diff & (*(long long*)&diff >> (sizeof(long long)*8-1)); //was sizeof(int)
double nestdiff = *(intarr+2) - (*(intarr + 1) + *(double *)&shift);
long long nestshift = *(long long*)&nestdiff & (*(long long*)&nestdiff >> (sizeof(long long)*8-1));
return (*intarr - *(double *)&shift) * ((*(intarr+2) - *(double *)&nestshift));
}
Re: help4e
Мдаа снощи случайно попаднах на нещо по въпроса
Начи ако има препълване тoва не дава верен резултат:
d = x - y
d&(d >> 31).
Примерно
long la[3] = {-1547483648, 1, 1547483648};
cout << mult(la) << "\n";
дава -1547483648.
Според пича най-простото и винаги работещо е
d = x-y
d&((d^( (x^y)&(d^x)))>>31)
Машина за отделяне на кожа и сланина от парени свине
Начи ако има препълване тoва не дава верен резултат:
d = x - y
d&(d >> 31).
Примерно
long la[3] = {-1547483648, 1, 1547483648};
cout << mult(la) << "\n";
дава -1547483648.
Според пича най-простото и винаги работещо е
d = x-y
d&((d^( (x^y)&(d^x)))>>31)
Машина за отделяне на кожа и сланина от парени свине