Информация об изменениях

Сообщение Re[23]: Carbon от 21.04.2024 10:54

Изменено 21.04.2024 10:55 kov_serg

Re[23]: Carbon
Здравствуйте, Sinclair, Вы писали:

S>Давайте попробуем починить UB в функции, написанной просто и строго по делу, безо всяких шаблонов:

S>
S>long avg(long a, long b, long c)
S>{
S>  return (a+b+c)/3; 
S>}
S>

Часть переполнение можно убрать заменив одни UB на другие
long avg(long a,long b,long c) {
    long r1=(a>>2)+(b>>2)+(c>>2), r2=r1%3; 
    r1-=r2; r2=4*r2+(a&3)+(b&3)+(c&3);
    if (r1<0 && r2>0) { r2-=12; r1++; }
    r1/=3; r2/=3; return (r1<<2)+r2;
}
Re[23]: Carbon
Здравствуйте, Sinclair, Вы писали:

S>Давайте попробуем починить UB в функции, написанной просто и строго по делу, безо всяких шаблонов:

S>
S>long avg(long a, long b, long c)
S>{
S>  return (a+b+c)/3; 
S>}
S>

Переполнение можно убрать, заменив одни UB на другие
long avg(long a,long b,long c) {
    long r1=(a>>2)+(b>>2)+(c>>2), r2=r1%3; 
    r1-=r2; r2=4*r2+(a&3)+(b&3)+(c&3);
    if (r1<0 && r2>0) { r2-=12; r1++; }
    r1/=3; r2/=3; return (r1<<2)+r2;
}