Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

проблема с divmod   Найти похожие ветки 

 
Квэнди ©   (2004-09-16 11:51) [0]

Почему при операции (-25) mod (3) результат равен -1
а при (-25) divmod (3) Ошибка "Integer overflow" ?
и как с этим бороться?


 
MBo ©   (2004-09-16 12:29) [1]

А на тип параметров этой процедуры не обратил внимания?

На первый взгляд, аналог для результатов c типом SmallInt можно сделать, заменив SHR на SAR  и DIV на IDIV.


 
palva   (2004-09-16 13:14) [2]

А что, разве неправильный тип параметров? Первый параметр Integer, второй Word.


 
Чайник   (2004-09-16 13:18) [3]

именно про типы я и говорю... не в курсе почему так? зачем было word делать ?


 
Чайник   (2004-09-16 13:20) [4]

Palva: да нет, тут тип результатов влияет: тип остатка Word , а остаток в данном случае отрицательный...


 
palva   (2004-09-16 13:36) [5]

А какой знак остатка должен быть в следующем примере?

{$APPTYPE CONSOLE}
uses math;
var
 wQ, wR: word;
begin
 DivMod(-2147483648, 65535, wQ, wR);
 Writeln(wQ, " ", wR) // Выдает 32768 32768
end.


 
MBo ©   (2004-09-16 13:40) [6]

>Чайник
А ты уверен, что отрицательный остаток- это правильно?


 
Чайник   (2004-09-16 13:48) [7]

Уверен, проверь (-3) mod (1) что выдаст....
palva
да, но почему тогда:
var
q,w:word;
begin
divmod (-3,2,q,w);
....
end;
выдает ошибку.... или ето только у меня?


 
palva   (2004-09-16 13:50) [8]

По-моему здесь первый параметр принимается как Integer, а интерпретируется как Cardinal. Тогда вычисления правильные. Их можно проверить:

{$APPTYPE CONSOLE}
uses math;
var
 i64: Int64;
begin
 i64 := 65535;
 i64 := i64*32768+32768;
 writeln(i64); // 2147483648 А с другой стороны...
 i64 := -2147483648 and $FFFFFFFF;
 writeln(i64); // 2147483648 - то же самое число
end.


 
Чайник   (2004-09-16 13:52) [9]

хм... и чо делать?: )


 
palva   (2004-09-16 13:54) [10]

Выдает ошибку, потому что переполнение. -3 интерпретируется как 2^64 - 3 Частное получается очень большим и не влезает в тип Word.


 
MBo ©   (2004-09-16 13:54) [11]

>Чайник
сделай функцию с предложенными в  [1] изменениями


 
palva   (2004-09-16 13:58) [12]

(-3) (1) у меня дает переполнение.

А чо делать не знаю. Сначала надо спросить а чо надо?


 
Чайник   (2004-09-16 14:48) [13]

MBo ок, попробую
palva: ну в качестве этих двух цифр может оказаться что угодно : -255 до 255 .. это для расчета оттенков цветов..


 
palva   (2004-09-16 15:40) [14]

Дык сделать, как MBo предложил:

{$APPTYPE CONSOLE}

procedure DivModI(
  Dividend: Integer; // Делимое
  Divisor: SmallInt; // делитель
  var Result, Remainder: SmallInt // частное и остаток
);
begin
 asm
       PUSH    EBX
       MOV     EBX,EDX
       MOV     EDX,EAX
       SAR     EDX,16
       IDIV    BX
       MOV     EBX,Remainder
       MOV     [ECX],AX
       MOV     [EBX],DX
       POP     EBX
 end;
end;
var
 wQ, wR: smallInt;
begin
 DivModI(-25, 7, wQ, wR); // -3 -4
 Writeln(wQ, " ", wR)
end.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.035 c
3-1094151683
Damager
2004-09-02 23:01
2004.10.03
Конвертация Paradox в Справочники 1С


14-1094822954
jack128
2004-09-10 17:29
2004.10.03
Как скопировать содержимое окна CPU


14-1095085359
Soft
2004-09-13 18:22
2004.10.03
Найден философский камень информатики.


1-1095236000
cvc
2004-09-15 12:13
2004.10.03
Делфи и Windows Mobile 2003?


4-1092750578
Skier
2004-08-17 17:49
2004.10.03
TOOLTIP with Balloon style





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский