Сообщение 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.:
нахрен я только в своё время голову засорял подобным ..
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.:
нахрен я только в своё время голову засорял подобным ..
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.:
нахрен я только в своё время голову засорял подобным ..