Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.53 MB
Время: 0.007 c
2-1204874909
Wint
2008-03-07 10:28
2008.04.06
Как передать параметры внешнему приложению DOS и запустить его?


3-1194865899
Den
2007-11-12 14:11
2008.04.06
управление БД из dll


2-1205322559
Сантехник
2008-03-12 14:49
2008.04.06
редактирование записи


2-1205351258
The X
2008-03-12 22:47
2008.04.06
Округление real-значений до некоторых знаков после запятой


2-1205245821
Ega23
2008-03-11 17:30
2008.04.06
Изображение в колонке TDBGridEh





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский