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

Сообщение Re: детектировать переполнения при целочисленных операциях от 19.08.2022 12:36

Изменено 19.08.2022 12:38 xma

Re: детектировать переполнения при целочисленных операциях
Здравствуйте, Sm0ke, Вы писали:

S>Есть два целых числа типа std::intmax_t

S>Необходимо произвести над ними одну из следующих операций: сложение, вычитание, умножение.
S>Но при переполнении результата преобразовать числа в double перед операцией и вернуть double.
S>А если переполнения нет, то вернуть целый результат.

S>Какие есть ещё варианты?


на асме накарячить по крайней мере для стандартных int'ов (32 bits) для x86 там можно было считать бит (после совершения операции) и по нему узнать — было ли переполнение, а также напр. при умножении результат лежал уже не в одном регистре (32-bit), а в двух ..

думаю x86-64 есть аналогичные варики для long (64 bits) ..

насчёт флагов во всяких MMX/SSE/AVX/AVX2 хз, как целочисленных возможностей последних (SSE/AVX/AVX2) — хз ..

но в любом случае, даже на x86 за счёт флага-бита переполнения можно было организовать работу с целыми числами любой разрядности — без потери точности .. (актуально для банковских приложений, переводы/счета и т.д.)

подробнее тут, "Assembler. Учебник для вузов. 2-е изд. В. И. Юров"

(для общего сведения)
[страница 165] Глава 8. Арифметические команды

(ну и собственно про сами операции с двоичными числами произвольной длины)
[страница 183] Арифметические операции над двоично-десятичными числам

P.S.:

нахрен я только в своё время голову засорял подобным ..
Re: детектировать переполнения при целочисленных операциях
Здравствуйте, Sm0ke, Вы писали:

S>Есть два целых числа типа std::intmax_t

S>Необходимо произвести над ними одну из следующих операций: сложение, вычитание, умножение.
S>Но при переполнении результата преобразовать числа в double перед операцией и вернуть double.
S>А если переполнения нет, то вернуть целый результат.

S>Какие есть ещё варианты?


на асме накарячить по крайней мере для стандартных int'ов (32 bits) для x86 там можно было считать бит (после совершения операции) и по нему узнать — было ли переполнение, а также напр. при умножении результат лежит уже не в одном регистре (32-bit), а в двух ..

думаю x86-64 есть аналогичные варики для long (64 bits) ..

насчёт флагов во всяких MMX/SSE/AVX/AVX2 хз, как целочисленных возможностей последних (SSE/AVX/AVX2) — хз ..

но в любом случае, даже на x86 за счёт флага-бита переполнения можно было организовать работу с целыми числами любой разрядности — без потери точности .. (актуально для банковских приложений, переводы/счета и т.д.)

подробнее тут, "Assembler. Учебник для вузов. 2-е изд. В. И. Юров"

(для общего сведения)
[страница 165] Глава 8. Арифметические команды

(ну и собственно про сами операции с двоичными числами произвольной длины)
[страница 183] Арифметические операции над двоично-десятичными числам

P.S.:

нахрен я только в своё время голову засорял подобным ..