Главная страница
    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.062 c
3-1094204977
Koala
2004-09-03 13:49
2004.10.03
Вопрос по нумерации документов


3-1094451877
qweqwe
2004-09-06 10:24
2004.10.03
Проблема с быстродействием


1-1095747881
drew
2004-09-21 10:24
2004.10.03
VB макрос...может кто поможет в листе Excel надо сравнить ячейки


3-1094532530
Some
2004-09-07 08:48
2004.10.03
Какой event вызывается при перемещении по DBGrid, поправте


1-1095611074
m52
2004-09-19 20:24
2004.10.03
Какую выбрать программу для создания дистрибутива?





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