Re[2]: Переполнение
От: Mckey Россия  
Дата: 24.04.07 04:23
Оценка: 3 (1)
Здравствуйте, fml1, Вы писали:

F>Здравствуйте, xsidxsid, Вы писали:


X>>Подскажите пожалуйста, какие типы переменных использовать, если мне необходимо перемножать числа следующего порядка


X>> 78242976*554= 43346608704;


F>Это не подойдет?

F>Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
F>Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
F>Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
F>Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
F>Comp -2^63+1 .. 2^63 -1 19-20 8
F>Currency -922337203685477.5808.. 922337203685477.5807 19-20 8

Можно еще так попробовать:

var
  i1:, i2, Res: Int64;

begin
  i1 := 78242976;
  i2 := 554; 
  Res := i1 * i2;
end;


Так вроде прокатывает..
Делай добро и бросай его в воду...
Re: Переполнение
От: fml1  
Дата: 24.04.07 02:20
Оценка: +1
Здравствуйте, xsidxsid, Вы писали:

X>Подскажите пожалуйста, какие типы переменных использовать, если мне необходимо перемножать числа следующего порядка


X> 78242976*554= 43346608704;


Это не подойдет?
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
Comp -2^63+1 .. 2^63 -1 19-20 8
Currency -922337203685477.5808.. 922337203685477.5807 19-20 8
Переполнение
От: xsidxsid  
Дата: 23.04.07 20:06
Оценка:
Подскажите пожалуйста, какие типы переменных использовать, если мне необходимо перемножать числа следующего порядка

78242976*554= 43346608704;

при использовании типа int64 происходит переполнение и результат равен 396935744, что неверно.

Как быть?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Переполнение
От: Shurik Ilyin Россия http://ppi-esa.narod.ru
Дата: 24.04.07 05:37
Оценка:
Здравствуйте, xsidxsid, Вы писали:

X>Подскажите пожалуйста, какие типы переменных использовать, если мне необходимо перемножать числа следующего порядка


X> 78242976*554= 43346608704;


X>при использовании типа int64 происходит переполнение и результат равен 396935744, что неверно.


X>Как быть?


2^64 / 2 — 1 = 9223372036854775807
Должно влезать.
Re[3]: Переполнение
От: xsidxsid  
Дата: 24.04.07 06:22
Оценка:
Здравствуйте, Mckey, Вы писали:

M>Здравствуйте, fml1, Вы писали:


M>Можно еще так попробовать:


M>
M>var
M>  i1:, i2, Res: Int64;

M>begin
M>  i1 := 78242976;
M>  i2 := 554; 
M>  Res := i1 * i2;
M>end;
M>


M>Так вроде прокатывает..


Да спасибо, так прокатило.
Вот что интересно, если переменные отличеются от от int64, то при умножении происходит переполнение
var i1, i2: ULONG;
    Res: int64;
begin
  i1:=78242976;
  i2:=554;
  Res:=i1*i2;
end;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Переполнение
От: xsidxsid  
Дата: 24.04.07 06:22
Оценка:
Здравствуйте, fml1, Вы писали:

F>Здравствуйте, xsidxsid, Вы писали:


X>>Подскажите пожалуйста, какие типы переменных использовать, если мне необходимо перемножать числа следующего порядка


X>> 78242976*554= 43346608704;


F>Это не подойдет?

F>Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
F>Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
F>Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
F>Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
F>Comp -2^63+1 .. 2^63 -1 19-20 8
F>Currency -922337203685477.5808.. 922337203685477.5807 19-20 8


Да, я смотрел эти типы. Ошибка возникала в умножении. Там переменные должны быть одного (большого) типа.
Вот так это будет правильно.

var
  i1:, i2, Res: Int64; //можно и Real48 и Single и Double и ...

begin
  i1 := 78242976;
  i2 := 554; 
  Res := i1 * i2; // здесь переменные должны быть одного типа
end;



А так не правильно, так было у меня.

var
  i1, i2: ULONG;
    Res: Int64; 

begin
  i1 := 78242976;
  i2 := 554; 
  Res := i1 * i2; // здесь фигня выводилась. Перемножение шло в типе ULONG, а потом результат после
                  // переполнения приводился к типу Int64
end;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Переполнение
От: xsidxsid  
Дата: 24.04.07 06:25
Оценка:
Здравствуйте, Shurik Ilyin, Вы писали:

SI>Здравствуйте, xsidxsid, Вы писали:


X>>Подскажите пожалуйста, какие типы переменных использовать, если мне необходимо перемножать числа следующего порядка


X>> 78242976*554= 43346608704;


X>>при использовании типа int64 происходит переполнение и результат равен 396935744, что неверно.


X>>Как быть?


SI>2^64 / 2 — 1 = 9223372036854775807

SI>Должно влезать.

Спасибо за ответ. Уже разобрался что за фигня была. Выше отписался.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Переполнение
От: Mckey Россия  
Дата: 24.04.07 09:31
Оценка:
Здравствуйте, xsidxsid, Вы писали:

>>поскипано.....


По моему где-то это даже в хелпе написано...
Делай добро и бросай его в воду...
Re[5]: Переполнение
От: xsidxsid  
Дата: 24.04.07 09:41
Оценка:
Здравствуйте, Mckey, Вы писали:

M>Здравствуйте, xsidxsid, Вы писали:


>>>поскипано.....


M>По моему где-то это даже в хелпе написано...

может быть... я не нашел этого...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.