Как в Си определить выход за приделы кода (переполнение) результата операции ?
26.04.2013, 01:59
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от alvadep
|
|
А в книге Уоррена наблюдается некая избыточность
|
Думаю, можно доказать эквивалентность этих неравенств:
|
Цитата:
|
"умножим" неравенство x›~y с обеих сторон на x&, так оно только усилиться, так как x&x=x, а x&~y‹=~y, получим
x›(x&~y)=x|y-y ---› x+y›x|y
|
"Почти" эквивалентно!
Смущает только то, что была операция с усилением неравенства, что не есть хорошо.
Сообщение от Yurkin2007
|
|
Формулу увж. электроТраша найти пока не удалось .
|
она на ст. 31, сверху.
Последний раз редактировалось electroTrash; 26.04.2013 в 02:05.
|
|
|
|
26.04.2013, 02:58
|
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от electroTrash
|
|
она на ст. 31, сверху.
|
Ну, все понятно. В том разделе автор обсуждает арифметические и логические операции, играется с заменой арифметического сложения "+" на логическое сложение ИЛИ. В частности утверждает, что логическое сложение дает равный или меньший результат, чем арифметическое сложение. За исключением случаев переполнения: тогда логическая операция дает больший результат. Только и всего. И Ваша формула как раз об этом.
А для проверки на переполнение, действительно, в ней избыточное усиление неравенства: можно запросто выкинуть логическое сложение, оставить только один операнд для сравнения с арифметической суммой.
Последний раз редактировалось Yurkin2007; 26.04.2013 в 03:04.
|
|
|
|
26.04.2013, 06:52
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от Yurkin2007
|
|
Только и всего. И Ваша формула как раз об этом.
|
А что этого не достаточно?! Но, чтобы внести ясность, я выведу то, на что Вы указали только намеком и весьма туманно.
|
Цитата:
|
|
так, выделим из суммы сумму переполнения: x+y=x+~x+y-~x=1+y-~x, а если суммировать по модулю числа соответствующему наибольшему возможному числу(обозначаем как 1 ), то условие наличие переноса будет таким y-~x›0 или x-~y›0, т.е. достаточно чтобы удовлетворялось условие y›~x (x›~y), а если учесть, что для сумма при отсутствии переполнения справедливо неравенство x+y›=x|y, получим, что при переполнении для суммы с потерей переноса 0‹((x+y)=(y-~x))‹(x|y), из которого понятно, что условие наличия переноса можно написать и так z›x+y, где z любое число в пределах 0‹z‹=(x|y),, в частном случае можно выбрать z равным x; y; (x|y), что автоматически позволяет удовлетворить условиям выбора для z.
|
Как видно из вышеприведенных выкладок, неравенство (x|y)›x+y дает возможность оценить верхнюю границу суммы при переполнении, т.е. оно дополняет основное условие x(y)›~y(~x), но не подменяет.
Последний раз редактировалось electroTrash; 26.04.2013 в 06:55.
|
|
|
|
26.04.2013, 11:29
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Если вы обсуждаете как исключить из выборки случайные результаты (помеху), то на это есть достаточно чёткая методика.
1. Определяете закон распределения ваших измерений (или выбираете).
2. На ходу считаете мат ожидание (ваше среднее)
3. На ходу определяете дисперсию, согласно выбранного закона распределения и выбранного уровня доверительного интервала.
4. Выбрасываете значения превышающие данный уровень из выборки.
===
На практике выглядит так. Если закон распределения нормальный, то считается скользящее среднее, и значения превышающие 1.4 от этого среднего отбрасываются.
Понятно, что частота выборки должна быть значительно выше чем скорость изменения входного сигнала. Она должна быть сопоставима с объёмом выборки. То есть если частота 8кГц, и вы считаете среднее по 16 выборкам, то частота входного сигнала не должна превышать 8/16/2 = 250 Гц.
По-моему так...
|
|
|
|
26.04.2013, 11:33
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от electroTrash
|
|
А чего тут понимать то, эти коэффициенты определяют вероятность того или иного значения, а их сумма всегда должна P1+P2+... +Pn=1, тогда X=X1*P1+...XnPn, непонятно другое, почему надо брать разные коэффициенты вне зависимости от величины измерения X1, а от порядкового номера, который определяется абсолютно произвольно?
|
Не произвольно. У вас равноотстоящие результаты. То есть результаты с частотой семплирования. Соответственно коэффициенты определяют частоту фильтрации сигнала.
|
|
|
|
26.04.2013, 11:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Неужели на Си так сложно проверять флаг переноса?
if (SREG.0 == 1) {
обработка переполнения
}
|
|
|
|
26.04.2013, 11:59
|
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от niXto
|
|
Неужели на Си так сложно проверять флаг переноса
|
Таким образом - не сложно, конечно.
Только страдает переносимость. Для каждого типа процессоров придётся переписывать программу, потому что у разных МК бит переноса сидит в разных местах.
Поэтому тут и изобретаются универсальные чисто сишные способы.
|
|
|
|
26.04.2013, 12:02
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от niXto
|
Неужели на Си так сложно проверять флаг переноса?
if (SREG.0 == 1) {
обработка переполнения
}
|
От сложения до проверки флага может быть и далеко...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
26.04.2013, 12:14
|
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от electroTrash
|
попробуйте ... объяснить причину относительно сложного выражения в вышеприведенной книге ...
Честно говоря, я ответа не знаю, думаю, что должно быть какое то логическое объяснение.
|
Причина Вы объяснена, я думаю, достаточно понятно.
Сообщение от electroTrash
|
Все эти условия проверки имеют ошибки, так сказать "слабые точки" ...
абсурдность этого условия очевидна ...
|
По-моему, сейчас самое время взять свои слова обратно, не так ли, увж. electroTrash ?
|
|
|
|
26.04.2013, 13:29
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от Yurkin2007
|
Таким образом - не сложно, конечно.
Только страдает переносимость. Для каждого типа процессоров придётся переписывать программу, потому что у разных МК бит переноса сидит в разных местах.
Поэтому тут и изобретаются универсальные чисто сишные способы.
|
Тогда нужно писать код так, чтобы переполнение вообще никогда не возникало... Добавить третий регистр. А не вначале создать проблему, а потом мужественно с ней бороться
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:38.
|
|