Re[23]: Carbon
От: kov_serg Россия  
Дата: 21.04.24 10:54
Оценка: 2 (1)
Здравствуйте, 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;
}
Отредактировано 21.04.2024 10:55 kov_serg . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.