Re[30]: Carbon
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.04.24 04:02
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Sinclair, Вы писали:


S>>Следите за руками: в дотнете прибавление единицы к int 0x7FFFFFFF даёт int 0x80000000 (overflows are ignored). Здесь нет никаких бит для отбрасывания, т.к. весь результат fits in the destination type.

S>>А в C++ такое прибавление даёт undefined behavior.

V>Продолжаешь пытаться показывать фокусы? ))

Продолжаю развеивать невежество.
V>Если в этот же код подать другое число, то может быть отбрасывание.
Ок, давайте подадим в этот код другое число. Например, 0xFFFFFFFF. Это, напомню, int(-1) в дополнительном коде. Прибавление единицы даст 0x100000000, и старший бит будет отброшен. Опять нет никакого undefined behavior, как бы вы ни старались.
V>Это даже уже не фокус у тебя, это мошенничество в расчёте на однобитную тусовку, один завсегдатай уже отметился.

V>Тебе же уже говорилось, что промежуточные вычисления в более широких типах допустимы прямо по стандарту.
. В четвёртый раз спрашиваю вас — что за "более широкий тип" применяется в is_max<long>?

V>И раздражает твоё непонимание понятия UB.

А уж меня-то как раздражает ваше непонимание UB. Я же носом ткнул уже вас в пример, когда один и тот же код, в одном и том же компиляторе, для одного и того же значения выдаёт разные результаты./
Но вы продолжаете фонтанировать чушью.

V>Т.е. вот у тебя в формуле встречается участок (a+b)/2, в котором может наступить переполнение и выдача ошибочного результата.

V>Разумеется, до факта переполнения формула остаётся работоспособной.
V>А после переполнения — неопределено, т.е. может остаться работоспособной, а может и не остаться.
"работоспособность" зависит от того, что мы вкладываем в это понятие. В частности, если мы зачем-то полагаемся на то, что этот код переполнится для чисел, сумма которых не влезает в тип результата, то это тоже может оказаться неверным. Компилятор, увидев в коде avg(x, x) после инлайна имеет право убрать всю арифметику, т.к. x*2/2 == x при отсутствии переполнения, а раз переполнение — UB, значит при его наступлении можно делать всё, что угодно.

V>И что ты рядом бил себя в грудь, что в дотнете формула достоверно будет неработоспособной — это потому что дотнет пока мест всё еще детская игрушка.

Нет, не поэтому. А потому что нет UB.
Для проверки ваших рассуждений попробуйте повторить их для unsigned long. Ровно тот же самый оптимизатор, который "не игрушка", почему-то не "отбрасывает никаких бит", и не сравнивает числа "в более высокой разрядности".
А как только вы поймёте, что рассмотренная оптимизация целиком построена на UB, можно будет попробовать прикинуть, применима ли она для языков, где в арифметике UB нет ни для беззнаковых, ни для знаковых типов.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.