25.04.2013, 21:42
|
#41
|
Прописка
Регистрация: 05.01.2013
Сообщений: 201
Сказал спасибо: 12
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от alvadep
|
Где примеры доказывающие обратное.
|
Обратное к чему? Очевидно же, что оно не удовлетворяется из sumADC›~temp16 ---› ~sumADC‹temp16, что приводит к неравенству sumADC+temp16›~sumADC+~temp16, т.е. что для произвольного X›~X???
И почему тогда в книге Генри Уоррена "Алгоритмические трюки для программистов" указано условие для проверки переполнения как:
Код:
|
if(sumADC|temp16)›(temp16+sumADC) // условие проверки переполнения |
,
|
|
|
|
25.04.2013, 22:06
|
#42
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
А что условие проверки переполнения из книги "Алгоритмические трюки для программистов" является единственно правильным решением и другие варианты не имеют право на существование? Почитайте пояснения к другим вариантам тут и тут и попробуйте аргументировано доказать (желательно на пальцах т.е. на числах) не правомерность таких решений.
|
|
|
|
25.04.2013, 22:25
|
#43
|
Прописка
Регистрация: 05.01.2013
Сообщений: 201
Сказал спасибо: 12
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от alvadep
|
попробуйте аргументировано доказать
|
Я уже привел свое доказательство, если не согласны, то попробуйте доказать, где допущена ошибка в моих выкладках и объяснить причину относительно сложного выражения в вышеприведенной книге (кстати, весьма интересной)?
|
|
|
|
25.04.2013, 22:38
|
#44
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от electroTrash
|
Обратное к чему? Очевидно же, что оно не удовлетворяется из sumADC›~temp16 ---› ~sumADC‹temp16, что приводит к неравенству sumADC+temp16›~sumADC+~temp16, т.е. что для произвольного X›~X???
|
Просто ~sumADC+~temp16 не равно ~(sumADC+temp16), как Вы утверждаете.
|
|
|
|
25.04.2013, 23:37
|
#45
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Вставлю и я свои 5 копеек.
Из sumADC›~temp16 или ~sumADC‹temp16 совершенно не значит, что sumADC+temp16›~sumADC+~temp16
Пример (для наглядности возьму 1 байт).
sumADC = 00000010
temp16 = 11111110
С этим согласны : 00000010 › ~11111110 или ~00000010 ‹ 11111110
А с этим : 00000010 + 11111110 › 11111101 + 00000001
Вот, что получается после сложения: 00000000 › 11111110
|
|
|
|
26.04.2013, 00:00
|
#46
|
Прописка
Регистрация: 05.01.2013
Сообщений: 201
Сказал спасибо: 12
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от Ara41
|
~sumADC+~temp16 не равно ~(sumADC+temp16)
|
Да, но только при переполнении! Для остальных случаев все верно.
Это неплохой пример математической софистики!
|
|
|
|
26.04.2013, 00:09
|
#47
|
Прописка
Регистрация: 05.01.2013
Сообщений: 201
Сказал спасибо: 12
Сказали Спасибо 29 раз(а) в 24 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Ну а как быть с вторым вопросом:
Сообщение от electroTrash
|
объяснить причину относительно сложного выражения в вышеприведенной книге (кстати, весьма интересной)?
|
PS. Честно говоря, я ответа не знаю, думаю, что должно быть какое то логическое объяснение.
|
|
|
|
26.04.2013, 00:28
|
#48
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Выражение
Цитата:
|
~sumADC+~temp16 не равно ~(sumADC+temp16)
|
однозначно в любом случае.
А в книге Уоррена наблюдается некая избыточность, ну кто не без греха.
|
|
|
|
26.04.2013, 00:32
|
#49
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от electroTrash
|
Да, но только при переполнении! Для остальных случаев все верно.
Это неплохой пример математической софистики!
|
не верно для всех случаев.
Представим инверсию числа Х как (-1-Х)
инверсию Y как (-1-Y)
л.ч. = -1-Х-1-Y=-2-Х-Y
п.ч. = -1-(X+Y) =-1-X-Y
Две части Вашего "равенства" будут отличаться на единицу.
|
|
|
|
26.04.2013, 00:50
|
#50
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Тэк-с. Не поленился и скачал упомянутую книгу Уоррена. И что мы видим?!? В разделе 2.12 "Обнаружение переполнения" на странице 42 русского перевода: для обнаружения переполнения при беззнаковом сложении х+у приведены две формулы проверки:
Если выполняется любое из условий, то будет переполнение при сложении.
Налицо полное единодушие с Генри!
Формулу увж. электроТраша найти пока не удалось ...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:24.
|
|