26 августа 2006 16:26 mcf wrote:
> Здравствуйте, v_m, Вы писали: > > v_m>26 августа 2006 00:49 piAnd wrote: > > v_m> c = x1*x3 + x2*x4; > > Уже здесь ошибка, дальнейшее не имеет смысла.
Без диапазона входных данных точно сказать нельзя. К тому же, в исходном
письме, кажется, переполнение было при ещё одном умножении суммы
произведений.
Здравствуйте, v_m, Вы писали: v_m> Без диапазона входных данных точно сказать нельзя. К тому же, в исходном v_m>письме, кажется, переполнение было при ещё одном умножении суммы v_m>произведений.
Диапазон такой, что вычисление x*x + x*x идет без overflow
26 августа 2006 19:06 piAnd wrote:
> a*c — это уже с overflow, сравнение старших ac_h, bd_h что будет > означать?, они ж уже overflow.
Да, overflow, но не сразу после операции умножения Результатом команды
imul является пара edx:eax. Впрочем, сейчас проверил, компилятор (gcc
4.1.4) на edx никакого внимания не обращает и оперирует после перемножения
только с eax, а жаль. Можно сказать, что overflow получается искуственный.
ps Вспомнил просто, что совершенно спокойно считал нормали (обсуждаемое
переполнение в формуле, очень похожей на расчёт нормали) с привлечением
ассемблера.
Здравствуйте, v_m, Вы писали:
v_m>imul является пара edx:eax. Впрочем, сейчас проверил, компилятор (gcc v_m>4.1.4) на edx никакого внимания не обращает и оперирует после перемножения
edx:eax это 64bit, если исходные типы 32bit, то естественно используется токо eax, если хотите и edx, то под msvc это __int64
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
26 августа 2006 21:05 Vain wrote:
> edx:eax это 64bit, если исходные типы 32bit, то естественно > используется токо eax,
Когда производится счет, компилятор может временно расширить тип.
Собственно, поэтому у меня и появилась мысль, что компилятор так и сделает,
ибо очевидно, что int * int легко может оказаться больше int.
Здравствуйте, v_m, Вы писали:
v_m>26 августа 2006 21:05 Vain wrote:
>> edx:eax это 64bit, если исходные типы 32bit, то естественно >> используется токо eax, v_m> Когда производится счет, компилятор может временно расширить тип. v_m>Собственно, поэтому у меня и появилась мысль, что компилятор так и сделает, v_m>ибо очевидно, что int * int легко может оказаться больше int.
Нифига не очевидно.
Если компилятор это учитывает, то это ошибка, так не должно быть.
И пусть попробует меня заставить не переполнить int
26 августа 2006 22:23 mcf wrote:
> сделает, v_m>ибо очевидно, что int * int легко может оказаться больше int. > Нифига не очевидно. > Если компилятор это учитывает, то это ошибка, так не должно быть.
Почему же ошибка? Он может досчитать оставшееся выражение и потом спокойно
обрезать до int.
> И пусть попробует меня заставить не переполнить int
А если вместо int будет short int, в один 32-битный регистр всё влезет, это
тоже будет ошибкой?
Здравствуйте, v_m, Вы писали:
v_m> Почему же ошибка? Он может досчитать оставшееся выражение и потом спокойно v_m>обрезать до int.
Бывают алгоритмы, в которых такой метод являлся бы ошибкой. Хотя это скорее исключение.