Re[5]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 01.02.22 17:32
Оценка: :)
Здравствуйте, sergii.p, Вы писали:

SP>уж что-что, но это не обычный заголовок. В данном случае .. в терминах математики означает [0; v.len()-1). Последний элемент не включается. То есть вы ещё один элемент откусили от вектора.


Всё верно, мне надо перебрать все элементы кроме последнего. И почему в этом "безопасном" языке даже такая простая конструкция скрывает в себе проблемы?

SP>Вообще циклы добавили в раст для выявления профнепригодности. Итераторы же есть.


Ах, ну да, я же забыл, пенсионерские отсталые циклы уже не в моде в этом сезоне, сейчас модная прогрессивная молодёжь использует клёвые весёлые итераторы.
Вот только индексация универсальнее итератора, и оптимизируется лучше.
Re[5]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 01.02.22 17:34
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Я, не зная языка rust, а просто исходя из записи ожидаю, что при пустом v индекс i будет принимать значения [0, -1). Если предположить, что для диапазона [0, -2) i будет принимать значения {0, -1}, то для диапазона [0, -1) индекс i будет принимать значение {0}.


Ээээ, вообще-то [0, -1), и [0, -2) тоже — это пустой диапазон

BFE>Мне не понятно, причём тут знаковость. В rust нельзя писать так: for i in 0 .. -8 ?


Можно, только v.len() имеет беззнаковый тип. Можно вручную скастить, только какого хрена я должен засирать код этим бойлерплейтом из-за чьей-то придури?
Re[6]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 01.02.22 17:35
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Тролите


Я пытаюсь показать, что между частями его сообщения нет никакой логической связи. Делаю я это, меняя посылку на противоположную, демонстрируя, что при этом ничего по сути не меняется.
Re[4]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 01.02.22 17:37
Оценка: +1
Здравствуйте, 5.März, Вы писали:

5M>В дотнете и тысяче других более-менее новых языков тоже все размеры и индексы знаковые


Но комитет Раста решил всё сделать через жопу
Re[8]: Коды ошибок и отрицательные числа
От: Андрей Тарасевич Беларусь  
Дата: 01.02.22 17:40
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

C>>Как могут быть объективными слова "the most of computations" без приведения статистики? Или Страуструп у нас уже Чак Норрис и видел весь код на свете, два раза? Аналогично можно сказать "the most of integer additions overflow, so let's make it long long by default".
S>Страуструп имел в виду, что первое же вычитание делает вычисление знаковым. Ну, потому, что очень мало кто ожидает при вычислении (5 — 8) получить 18446744073709551613, а не -3.

Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.

Страуструп говорит совсем другое. Страуструп говорит, что в ситуации, когда "в аудитории было 5 студентов, затем пришли еще 3, а затем ушли 8" безалаберный Джонни может начать с вычитания 5 — 8 и получения пугающего Джонни результата (даже если в итоге он приведет к правильному ответу). И чтобы программирование стало менее пугающим для таких безалаберных Джонни, лучше сразу работать в знаковой арифметике.
Best regards,
Андрей Тарасевич
Re[7]: Коды ошибок и отрицательные числа
От: Андрей Тарасевич Беларусь  
Дата: 01.02.22 17:48
Оценка:
Здравствуйте, B0FEE664, Вы писали:

N>>А теперь повторите это для прохождения по элементам в порядке убывания индексов.


BFE>
BFE>for(auto i = v.size()-1; i != -1; --i)
BFE>...
BFE>


Это — правильно, но содержит другой подводный камень. Если вдруг окажется, что `size()` возвращает "маленький" беззнаковый тип, т.е. тип подпадающий под integral promotions, то цикл снова получится бесконечным.

Идиоматический код для обратной итерации до нуля прекрасно известен

for (auto i = v.size(); i > 0; )
{
  --i;
  
  //...
}


или, если вы предпочитаете

for (auto i = v.size(); i-- > 0; )
{
  //...
}


Все.

Эта идиома, еще раз, пригодится не только при работе с беззнаковой арифметикой, но и, как я уже говорил выше, для обратной итерации по любым интервалам, выход за левую границу которых недопустим: интервалы итераторов, интервалы указателей, и т.п.
Best regards,
Андрей Тарасевич
Отредактировано 01.02.2022 17:59 Андрей Тарасевич . Предыдущая версия .
Re[13]: Коды ошибок и отрицательные числа
От: Андрей Тарасевич Беларусь  
Дата: 01.02.22 17:55
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Она распространяется не только на беззнаковые типы, но и на указательную арифметику, на итераторы, на потоки и на массу других концепций боле высокого уровня.


TB>И как же сложить два итератора? Или два потока?

TB>Индекс можно являться участником арифметических выражений (и является), а итератор, ну разве что в a-b, и то только для векторов.

Это не имеет никакого отношения к рассматриваемой теме.

К рассматриваемой теме имеет отношение то, что для ряда дискретных "итераторных" сущностей диапазоны вида [a, b) невозможно тривиальным образом превратить в обратные диапазоны [b-1, a-1) по той причине, что выражение `a-1` либо вообще не определено, либо дает "неправильный" результат. Это относится и к беззнаковой индексации/позиционированию, и к итераторам/указателям и еще очень много к чему. В этом и состоит суть рассматриваемой проблемы.
Best regards,
Андрей Тарасевич
Отредактировано 01.02.2022 18:00 Андрей Тарасевич . Предыдущая версия .
Re[9]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 01.02.22 18:27
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

S>>Страуструп имел в виду, что первое же вычитание делает вычисление знаковым. Ну, потому, что очень мало кто ожидает при вычислении (5 — 8) получить 18446744073709551613, а не -3.


АТ>Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.


Что за жёлтая муть?
В мире существует множество разных понятий, которые можно свести к числам, и, например, векторов (включая противоположно направленные) в нём не меньше, чем чисел.
И даже количество материи может быть отрицательным (временно, на квантовом уровне).

АТ>Страуструп говорит совсем другое. Страуструп говорит, что в ситуации, когда "в аудитории было 5 студентов, затем пришли еще 3, а затем ушли 8" безалаберный Джонни может начать с вычитания 5 — 8 и получения пугающего Джонни результата (даже если в итоге он приведет к правильному ответу). И чтобы программирование стало менее пугающим для таких безалаберных Джонни, лучше сразу работать в знаковой арифметике.


Проблема, да, в самой операции вычитания и определения корректности промежуточных значений. Не бывает отрицательного количества студентов, редко бывает в чистом виде отрицательных денег (случай кредита под 0% это всё равно кредит), и так далее — и что, от этого не пользоваться этими числами, когда это не нарушает корректность модели?

Использование знаковых тут позволяет оставаться в пределах действительно понятных на любом шаге чисел.

Но в таких операциях проще понять (обычно), если вылезешь в минус.
А вот отсутствие for с постпроверкой, например, приводит к грустным костылям.
The God is real, unless declared integer.
Re[14]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 01.02.22 18:48
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>К рассматриваемой теме имеет отношение то, что для ряда дискретных "итераторных" сущностей диапазоны вида [a, b) невозможно тривиальным образом превратить в обратные диапазоны [b-1, a-1) по той причине, что выражение `a-1` либо вообще не определено, либо дает "неправильный" результат. Это относится и к беззнаковой индексации/позиционированию, и к итераторам/указателям и еще очень много к чему. В этом и состоит суть рассматриваемой проблемы.


Значит для итераторов арифметика не работает, только и всего.
Это не повод портить арифметику индексов
Re[7]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 01.02.22 20:29
Оценка:
Здравствуйте, cppguard, Вы писали:

N>>Разумеется, это само по себе не признак безусловной правоты, но, в отличие от любого из нас, кто видит от силы 10% языка, люди в комитете видят все варианты применения (вплоть до самых извращённых), получают массу сведений о проблемах, до которых крайне сложно самому додуматься, и так далее.


C>Есть разница в том, чтобы видеть различные примеры использования языка и понимать на практике сильные и слабые стороны.


И вы всерьёз считаете, что человек, который пусть сам пишет, но один частный вариант, будет лучше понимать тонкости, чем тот, кто пусть пишет примерчики и мелкие тесты, но зато видит от других огромное количество вариантов, о которых бы никогда не додумался?

N>>Люди из тайги, повторю мысль, видят только тайгу. Человек из тайги может думать, что все едят оленей и кедровые орехи.

C>А люди из Сан-Франциско — только бомжей и ссанину, и что? Я тут вашу мысль не понял.

См. выше.

C> Страуструп действительно дед, а тон его статьи вкупе с тем, что никаких примеров из реальной жизни (рабочий код, открытые проекты) он не привёл,


Примеры, я уверен, специально подобраны так, чтобы отображать конкретную идею на минимальном количестве символов. Для этого им не нужно быть выдиркой реального кода, скорее наоборот.

C> позволяет использоваться оборот "учить жизни", который оскорбительным в целом и не является.


Но всё отношение к нему — было однозначно уничижительным.

N>>Может, оно таки объективно? (см. выше)

C>Как могут быть объективными слова "the most of computations" без приведения статистики? Или Страуструп у нас уже Чак Норрис и видел весь код на свете, два раза? Аналогично можно сказать "the most of integer additions overflow, so let's make it long long by default".

long long тоже переполнится
Статистика тут, безусловно, будет врать без уточнения разделения по крупным сродственным группам (типа, в среднем человек имеет одну грудь), но про источники можно было попытаться спросить напрямую. Вообще, ACM и IEEE (как минимум) периодически собирают такие данные.

N>>Тогда против чего вы возражаете данным сообщением? Страуструп высказывался в первую очередь про индексы и размеры.


C>Против его аргументов. И не возражаю, а просто высказал своё мнение насчёт ценности статьи. Но знал бы, что комментарий породит столько флуда, не стал бы писать, чтобы не увеличивать мировую энтропию =) Предлагаю на этом закончить обсуждение в этой ветке. Я получил комментарии, было очень интересно узнать новое, есть над чем подумать.


Я тоже. И продолжу поддерживать как знаковость по умолчанию, так и мастдайность эхотага с заменой на что-то приличное как можно быстрее
The God is real, unless declared integer.
Re[7]: Коды ошибок и отрицательные числа
От: kov_serg Россия  
Дата: 01.02.22 20:43
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


_>>Тролите


TB>Я пытаюсь показать, что между частями его сообщения нет никакой логической связи. Делаю я это, меняя посылку на противоположную, демонстрируя, что при этом ничего по сути не меняется.


просто unsigned почти всегда >=0, (кроме случаев с "умным" компилятором и неопределенной переменной)
Re[8]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 01.02.22 20:57
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>просто unsigned почти всегда >=0, (кроме случаев с "умным" компилятором и неопределенной переменной)


Дык он хочет проверять unsigned<BIG_VALUE, и говорит, что это проще, чем проверить signed>=0
Re[8]: Коды ошибок и отрицательные числа
От: cppguard  
Дата: 02.02.22 00:28
Оценка:
Здравствуйте, netch80, Вы писали:

N>И вы всерьёз считаете, что человек, который пусть сам пишет, но один частный вариант, будет лучше понимать тонкости, чем тот, кто пусть пишет примерчики и мелкие тесты, но зато видит от других огромное количество вариантов, о которых бы никогда не додумался?


Я, честно, не вижу смысла в этом споре. Просто для справки: коммитет (со Страуструпом среди прочих) подарили нам мёртворождённый auto_ptr и string, который сначала copy-on-write, а потом never copy-on-write. Это, конечно же, они сделали на основе своего глупокого и многолетнего опыта разработки.

N>Но всё отношение к нему — было однозначно уничижительным.


Отнюдь. Максимум — шутливое.
Re[9]: Коды ошибок и отрицательные числа
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.02.22 03:42
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.

И каков же в нашем мире результат вычитания 8 из 5?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.02.22 07:48
Оценка:
Здравствуйте, cppguard, Вы писали:

N>>И вы всерьёз считаете, что человек, который пусть сам пишет, но один частный вариант, будет лучше понимать тонкости, чем тот, кто пусть пишет примерчики и мелкие тесты, но зато видит от других огромное количество вариантов, о которых бы никогда не додумался?


C>Я, честно, не вижу смысла в этом споре. Просто для справки: коммитет (со Страуструпом среди прочих) подарили нам мёртворождённый auto_ptr и string, который сначала copy-on-write, а потом never copy-on-write. Это, конечно же, они сделали на основе своего глупокого и многолетнего опыта разработки.


"глупокий" — хорошее слово. Случайно или намеренно?

В случае string, я подозреваю, это ориентация на типовые свойства процессоров. За ~20 лет, например, важность кэширования и проблем с ним возросла не просто — с минимума до всепоглощающего уровня.
Похожая реформа прошла и в Java — JVMы перешли на не-COW строки в районе Java 8.
С auto_ptr — я пропустил период его значимости (я плотно вернулся к C++ в районе 2014) и не знаю, какие там фундаментальные проблемы. cppreference.com описывает по сути только одно: у него копирование работает как перемещение. С учётом того, что с 1988 по 2011 не могли стандартизовать семантику перемещения, проблема сидела где-то глубже — в районе принципиальной способности комитета принять решения — но что мешало тогда, честно, облом вкапываться, это совсем другая проблема.

Тем не менее, отдельные ляпы не дают причин сомневаться в неработоспособности механизма узнавания фундаментальных проблем в целом.

N>>Но всё отношение к нему — было однозначно уничижительным.

C>Отнюдь. Максимум — шутливое.

Ну ok...
The God is real, unless declared integer.
Re[8]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 02.02.22 09:09
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

N>>>А теперь повторите это для прохождения по элементам в порядке убывания индексов.

BFE>>
BFE>>for(auto i = v.size()-1; i != -1; --i)
BFE>>...
BFE>>


АТ>Это — правильно, но содержит другой подводный камень. Если вдруг окажется, что `size()` возвращает "маленький" беззнаковый тип, т.е. тип подпадающий под integral promotions, то цикл снова получится бесконечным.

Если писать с нулевой терпимостью к предупреждениям, то тогда и в этом случае проблем не будет:
for(auto i = v.size()-1; i != static_cast<decltype(i)>(-1); --i)


АТ>Идиоматический код для обратной итерации до нуля прекрасно известен

Да, он состоит в том, чтобы использовать итераторы в связке с std:/std::ranges::for_each
Индексы редко нужны.
И каждый день — без права на ошибку...
Re[10]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 02.02.22 09:16
Оценка:
Здравствуйте, Sinclair, Вы писали:

АТ>>Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.

S>И каков же в нашем мире результат вычитания 8 из 5?
В реальном мире = 0. С оговоркой, что 0 — это пусто.
В мире идей = -3.
Выберите свой мир.
И каждый день — без права на ошибку...
Re[11]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.02.22 09:34
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

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


АТ>>>Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.

S>>И каков же в нашем мире результат вычитания 8 из 5?
BFE>В реальном мире = 0. С оговоркой, что 0 — это пусто.

Точно не ноль. Скорее — исключение по невозможности совершить операцию.

BFE>В мире идей = -3.

BFE>Выберите свой мир.

Ваша вселенная удивительна, но людям там слегка не место.
The God is real, unless declared integer.
Re[12]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 02.02.22 10:00
Оценка:
Здравствуйте, netch80, Вы писали:

АТ>>>>Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.

S>>>И каков же в нашем мире результат вычитания 8 из 5?
BFE>>В реальном мире = 0. С оговоркой, что 0 — это пусто.
N>Точно не ноль. Скорее — исключение по невозможности совершить операцию.
Исключение в реальном мире? Это как? Допустим вы полезли в холодильник с целью достать оттуда 8 куриных яиц, а там только 5. И тут случилось "исключение по невозможности совершить операцию". Что это может быть?

BFE>>В мире идей = -3.

BFE>>Выберите свой мир.
N>Ваша вселенная удивительна, но людям там слегка не место.
В современном мире реалисты встречаются редко: одни в бога верят, другие — в отрицательные числа...
И каждый день — без права на ошибку...
Re[13]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.02.22 10:15
Оценка: 1 (1) +1
Здравствуйте, B0FEE664, Вы писали:

АТ>>>>>Нет. Кардинальные (количественные) вычисления всегда беззнаковы, сколько бы вы ни занимались вычитаниями. Наш мир принципиально беззнаков по отношению к количественным величинам. И становиться "знаковым" из-за вычитания ему нет никакой необходимости.

S>>>>И каков же в нашем мире результат вычитания 8 из 5?
BFE>>>В реальном мире = 0. С оговоркой, что 0 — это пусто.
N>>Точно не ноль. Скорее — исключение по невозможности совершить операцию.
BFE> Исключение в реальном мире? Это как?
BFE> Допустим вы полезли в холодильник с целью достать оттуда 8 куриных яиц, а там только 5. И тут случилось "исключение по невозможности совершить операцию". Что это может быть?

Обнаружили, что есть только 5 яиц. Задача не может быть выполнена. Действие достать яйца отменяется, происходит переход к более общей задаче и пересчёт ситуации. Может, надо изменить рецепт и ограничиться 5 яйцами. Может, надо сходить к соседям или в магазин. Много вариантов.
И, заметьте, обработка на более высоком уровне это один к одному, как если бы в коде стоял try-catch с ловлей ситуации "не хватило" в вызывающей функции.

Всё просто и банально, надо только рассмотреть реальность.

Вот если бы стояла задача "взять сколько есть яиц, но максимум 8" (причём с уточнением, что неважно, сколько реально взято! а то у вас и 5-8==0, и 3-8==0, и 0-8==0), то ваш вариант был бы адекватным задаче.

BFE>>>В мире идей = -3.

BFE>>>Выберите свой мир.
N>>Ваша вселенная удивительна, но людям там слегка не место.
BFE>В современном мире реалисты встречаются редко: одни в бога верят, другие — в отрицательные числа...

Могу только порадоваться уровню вашей самокритики. Но адекватности ей это не даёт.
The God is real, unless declared integer.
Отредактировано 02.02.2022 11:00 netch80 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.