Re[3]: Попинайте арифметику
От: watchmaker  
Дата: 02.06.14 18:10
Оценка:
Здравствуйте, Marty, Вы писали:

W>>Понадобилось? Зачем? Почему не подошло готовое?

M>Искать дольше
То есть вопрос правильности не стоит?

W>>Ну, видимо невнимательно прочитал ту тему. Вот например:

M>Внимательно. Те компиляторы, которые я использую, все делают как нужно. Пока это устраивает.
Ясно. Хотя всё равно непонятно зачем оставлять явные ошибки, если можно сразу написать правильно.

M>Хотя эта копипаста самому не очень нравится,

В этом коде, кстати говоря, ещё один довольно сомнительный подход используется. Зачем нужно проводить вычисления над 8-,16-,32-х битными числами если длина машинного слова 64 бита (судя по наличию UINT64). Вместо этого просто сразу расширяешь все короткие числа до машинного слова, обрабатывать их как обычно, а потом, если нужно, при упаковке обратно проверять все переполнения.
Это же дико (и медленно) умножать два числа через полубайты, если у тебя регистр 64 или 32 бита. Ещё более дико становится если вспомнить, что много где есть возможность умножить пару машинных слов и получить результат двойной длины.

В общем, поэтому и спрашивал, зачем это нужно. Ибо сейчас код неправильный, небыстрый и некрасивый (сам просил попинать).

W>>Эта функция у тебя иногда возвращает отрицательный результат вследствие переполнения на минимальном целом.

M>Это как?
integer_abs должна возвращать неотрицательный результат, так? А вот integer_abs<int32_t>(-2147483648) возвращает число меньше нуля, хотя аргумент функции в int32_t помещается. Уж не знаю что ты с этим будешь делать, но явно тут прослеживается неконсистентность в подходе — одни функции пытаются сообщать об переполнениях, а другие их игнорируют.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.