Форум: "Основная";
Текущий архив: 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