Форум: "Прочее";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизВот такой вопрос , если перемножаю две переменные типа longint Найти похожие ветки
← →
smartleds (2008-02-21 21:30) [0]longint 32bit от -2147483648...2147483647 и получившееся число записываю в переменную того же типа longint и если это число получается больше 32 бит, то младшие биты не учитыаются? так или нет?
← →
Loginov Dmitry © (2008-02-21 21:38) [1]число больше 32 бит не получится.
← →
smartleds (2008-02-21 21:41) [2]Это я понял просто младшие биты будут проигнорированы так?
← →
Loginov Dmitry © (2008-02-21 21:43) [3]Скорее старшие. За что младшие-то игнорить?
← →
smartleds (2008-02-21 21:47) [4]младшие они же менее значимые чем старшие , поэтому игнорирую менее значимые биты
← →
Anatoly Podgoretsky © (2008-02-21 21:48) [5]
> число больше 32 бит не получится.
Правила математики говорят, что получится.
Процедуры программного умножения учитывают это факт и функция умножения определяется так Mul(A, B: LongInt): Int64;
← →
Loginov Dmitry © (2008-02-21 21:52) [6]> Mul(A, B: LongInt): Int64;
еще подскажи автору, как ее реализовать. Этож еще и додуматься нужно, чтоб оно заработало правильно.
← →
Anatoly Podgoretsky © (2008-02-21 21:53) [7]2147483647 * 2147483647 = $3FFFFFFF 00000001
← →
smartleds (2008-02-21 21:55) [8]ну у меня же формат longint 32 бита
Или какой формат мне выбрать чтобы при выходе значения числа за рамки формата менее значимые биты игнорировались, формат должен быть 32 бита
← →
Anatoly Podgoretsky © (2008-02-21 21:55) [9]
> еще подскажи автору, как ее реализовать
Реализовано, в форме A*B, результат я привел
← →
Anatoly Podgoretsky © (2008-02-21 21:56) [10]
> чтобы при выходе значения числа за рамки формата менее значимые
> биты игнорировались
А нафига нужен неправильный результат?
← →
smartleds (2008-02-21 22:01) [11]мне нужно чтоб , менее значимые биты отбросились.
Я делаю эмулятор работы контроллера, там нет плавающей точки, максимальное число 32 бита и при перемножении , если число не влазит менее значимые биты откидываются.
← →
Loginov Dmitry © (2008-02-21 22:07) [12]> Я делаю эмулятор работы контроллера, там нет плавающей точки,
> максимальное число 32 бита и при перемножении , если число
> не влазит менее значимые биты откидываются.
Ну не перемножай большие числа. И все дела!
Либо используй Int64, а если контроллер не может выполнять такое умножения, придется программить его вручную.
← →
Anatoly Podgoretsky © (2008-02-21 22:13) [13]Ну получишь ты 3F00000001 и что должно по твоему остаться и как потом с этим работать? Гадать?
← →
smartleds (2008-02-21 22:16) [14]Да как раз мне и надо перемножать большие числа и откидывать ту часть которая не лезет в 32 бита.
Вот наприме в Си если переменной присвоить значение которое в нее не лезет, то менее значимые биты игнорируются , вот мне так надо , как это сделать в паскале?
← →
Loginov Dmitry © (2008-02-21 22:19) [15]> Вот наприме в Си если переменной присвоить значение которое
> в нее не лезет, то менее значимые биты игнорируются , вот
> мне так надо , как это сделать в паскале?
Кто ж тебя такому учит?
← →
smartleds (2008-02-21 22:23) [16]А что, так и есть в Си для контроллеров.
А у Вас в паскале как?
← →
Loginov Dmitry © (2008-02-21 22:26) [17]> А что, так и есть в Си для контроллеров.
> А у Вас в паскале как?
А у нас в паскале для контроллеров - по-другому.
← →
smartleds (2008-02-21 22:28) [18]Да в обычном делфи как? я же симулятор ваяю на нем, чтож уменя симулятор будет работать не так как контроллер :(.
← →
Anatoly Podgoretsky © (2008-02-21 22:28) [19]> smartleds (21.02.2008 22:23:16) [16]
Ты упорно умалчиваешь, что должно остаться и что потом с этим делать, пример для ответа выше.
А про СИ не ври.
← →
Loginov Dmitry © (2008-02-21 22:33) [20]> Да в обычном делфи как? я же симулятор ваяю на нем, чтож
> уменя симулятор будет работать не так как контроллер :(.
Не стал бы использовать контроллер с такими зверскими правилами умножения.
Допускаю, что ошибка переполнения будет разрешаться таким отбрасыванием. Но это никоем образом не "игнорирование менее значимых битов". В целочисленной арифметике все биты одинаково значимы.
← →
smartleds (2008-02-21 22:43) [21]должны остатся 32 наиболее значимых бита
← →
Anatoly Podgoretsky © (2008-02-21 22:47) [22]> smartleds (21.02.2008 22:43:21) [21]
Это слова, проилюстрируй цифрами, пускай после умножения поучились следующие варианты
3F 00 00 00 00 -> ?
03 F0 00 00 00 -> ?
00 3F 00 00 00 -> ?
← →
Loginov Dmitry © (2008-02-21 22:55) [23]> должны остатся 32 наиболее значимых бита
да на тебе!
function CrazyMul(A, B: Integer): Integer;
var
Value: Int64;
IntAr: array[Boolean] of Integer absolute Value;
begin
Value := Int64(A) * B;
Result := IntAr[(Value > High(Integer)) or (Value < Low(Integer))];
end;
Только что с этим потом делать - большой вопрос!!!
← →
smartleds (2008-02-21 22:57) [24]Берем в виндосе калькулятор перемножаем 2147483647 * 2147483647 переключаемся на BIN отсчитываем слква 32 бита вот и результат FFFFFFFC
← →
Anatoly Podgoretsky © (2008-02-21 23:03) [25]Не уходи от вопроса, тебе даны три числа, приведи результат
← →
smartleds (2008-02-21 23:07) [26]вот результат ---> FFFFFFFC
← →
Anatoly Podgoretsky © (2008-02-21 23:10) [27]Таких битов в привеных образцах нет.
Ты читать то умеешь?
← →
smartleds (2008-02-21 23:16) [28]А Вы умеете? Я не раз уже писал что я имею ввиду и словами и на примерах
И причем здесь эти числа
3F 00 00 00 00 -> ?
03 F0 00 00 00 -> ?
00 3F 00 00 00 -> ?
← →
Германн © (2008-02-22 00:14) [29]
> smartleds (21.02.08 22:23) [16]
>
> А что, так и есть в Си для контроллеров.
Бред.
← →
smartleds (2008-02-22 00:27) [30]Согласен , здесь признаю свою ошибку , но только здесь.
← →
Германн © (2008-02-22 00:51) [31]
> smartleds (22.02.08 00:27) [30]
>
> Согласен , здесь признаю свою ошибку , но только здесь.
>
Где здесь?
Я ответил "Бред" главным образом потому, что подобный алгоритм противоречит законам арифметики. И ни один контроллер не может работать по такому алгоритму (если он разработан на нашей планете :).
Но ты не сказал что делает тот контроллер, работу которого ты пытаешься эмулировать. А он (контроллер) вполне может выполнять некие вычисления над вещественными числами. Вот там такое поведение вполне нормальное. Там младшие биты мантиссы действительно отбрасываются. Но такую арифметику нельзя эмулировать работая с целыми числами.
← →
Германн © (2008-02-22 00:58) [32]
> Но такую арифметику нельзя эмулировать работая только с целыми
> числами.
>
← →
app © (2008-02-22 01:03) [33]Здесь цирк заканчиваем
← →
www (2008-02-22 10:57) [34]
> если это число получается больше 32 бит, то младшие биты
> не учитыаются?
range check error
← →
DiamondShark © (2008-02-22 23:33) [35]
> Вот наприме в Си если переменной присвоить значение которое
> в нее не лезет, то менее значимые биты игнорируются
У тебя неправильный Си.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c