spamsink: (Default)
[personal profile] spamsink

Опишите реалистичную систему двоичной машинной арифметики без прерывания по переполнению, в которой нахождение максимального представимого целого со знаком с помощью кода на Си
int imax=0, next=1;
while (next > imax) {
    imax = next;
    next = next*2+1;
}
не будет работать.

Это система, у которой нет отдельного целочисленного арифметического устройства, а целые числа суть точно представленные числа с плавающей точкой, имеющие целое значение.

Date: 2014-12-04 05:23 am (UTC)
From: [identity profile] fatoff.livejournal.com
int имеет фиксированное количество бит. Хм... Почему вопрос? Прерывание по переполнению, это сигнал от процессора?

Date: 2014-12-04 08:06 am (UTC)
From: [identity profile] avva.livejournal.com
Просто считать 1000...0 положительным, а не отрицательным, и все. Да, проверять знак становится чуть более сложным, но не значительно.

Date: 2014-12-04 08:16 am (UTC)
From: [identity profile] archaicos.livejournal.com
А как это число получится из, скажем, 0x7fffffff 2 * 1 +?

Date: 2014-12-04 08:22 am (UTC)
From: [identity profile] avva.livejournal.com
Не получится, в том-то и суть.

Date: 2014-12-04 09:41 am (UTC)
From: [identity profile] archaicos.livejournal.com
А, да.

Date: 2014-12-04 08:41 am (UTC)
From: [identity profile] avva.livejournal.com
huh? в условии спрашивается, как устроить, чтобы *2+1 НЕ приводило к максимальному значению ("не будет работать"), ну так оно и не приводит.

Максимальное значение 10000....0
Прыжки *2+1 приводят к 0111....1, следующий такой прыжок даст 1111...1 = -1, отрицательное число, поэтому алгоритм останавливается на 0111...1, но на самом деле максимальное целое значение на 1 больше.

Date: 2014-12-04 06:01 pm (UTC)
From: [identity profile] sab123.livejournal.com
Мне пришло в голову просто поменять местами представление положительных и отрицательных чисел в дополнительном коде. Что приводит к тому же эффекту.

Date: 2014-12-04 06:56 pm (UTC)
From: [identity profile] sab123.livejournal.com
Про стандарт в вопросе речи не было.

Date: 2014-12-04 07:14 pm (UTC)
From: [identity profile] sab123.livejournal.com
Ну так реалистичная. Если по какой-то причине очень-очень надо расширить диапазон представления положительных чисел на единичку, то самый дешевый способ это сделать - вот так.

Date: 2014-12-04 06:25 pm (UTC)
From: [identity profile] avva.livejournal.com
И зря, кстати. И вообще, это в C, а в C++ стандарт разрешает, насколько я вижу. В записи не указан язык :)

Date: 2014-12-04 07:18 pm (UTC)
From: [identity profile] sab123.livejournal.com
Реализация на странном железе не обязана соответствовать стандарту. Тут уж какое есть - такое есть, придется писать нестандартные программы.

Date: 2014-12-04 08:11 am (UTC)
From: [identity profile] archaicos.livejournal.com
Один вариант могу дать из соображения того, что при наступлении переполнении условие next*2+1 > next может оставаться верным. Например, если среди битового представления чисел существует специальное значение типа плюс бесконечности, которое получается при переполнении. Тогда на выходе из цикла imax будет равно этой бесконечности, а не максимальному представимому целому.

Date: 2014-12-04 09:38 am (UTC)
From: [identity profile] archaicos.livejournal.com
Представление с сатурированными жирными кислотами! :)

Date: 2014-12-04 07:32 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Емним обычная арифметика PDP-11 - там при сравнении учитывается флаг переполненния. Потому при переполнении оно все равно останется "больше"

Date: 2014-12-04 09:16 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Хитрый оптимизатор может предположить, что переполнения никогда не случится (иначе UB) и next > imax всегда.

Насколько я понимаю логику оптимизаторов, ндёжнее использовать unsigned int (и приводить к int только при сравнении). А ещё лучше — взять INT_MAX. Но, боюсь, речь идёт не об int, а о каком-то специфическом типе, не имеющем беззнакового аналога (вроде uid_t)?

Date: 2014-12-04 09:23 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
> Если двойку вынести в переменную, значение которой неизвестно оптимизатору, то не сможет предположить, потому что не будет знать, как изменяется значение next.

Оптимизаторы становятся всё умнее. Прятать переменную придётся очень хорошо и без гарантии, что оптимизатор следующей версии не найдёт.

> У какого числового типа нет беззнакового аналога?

Пример я привёл. Платформо-зависимый псевдоним, для которого даже неизвестно, знаковый он или нет.

Извиняюсь за некропост

Date: 2015-01-05 01:21 pm (UTC)
From: [identity profile] anonim-legion.livejournal.com
Подойдет любая реализация длинной арифметики. Завершится оно не из-за прерывания по переполнению, а по OutOfMemoryException.
Page generated Mar. 8th, 2026 07:35 am
Powered by Dreamwidth Studios