Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Длинные числа не умещается в Int64


Автор: ShowMessage 20.12.2006, 02:03
Здраствуйте!)

у меня есть 10 ти значное число и я делаю матиматиские вычисления и оно невлазит число в Int64
к примеру 

Код

Var
 a: Int64;
 b: String;
begin
 // b то самое 10 ти значное число оно непостоянное образуется в процессе выполнения программы
a:= StrToInt64(b)-((round(StrToInt64(ID)/128))*128);
 // деление без остатка, получается целое число



Как можно сдеать такое вычисление? чтобы результат был нормальным....
Иногда получается норм а иногда когда число невлазит в Int64 и оно даёт мне число с минусом (отрицательное).

Автор: Nicholas_S 20.12.2006, 02:30
ShowMessage, Int64 64-разрядный тип данных, т.е. -2^63..2^63-1, поэтому любое 10-тизначное число туда влезает по-любому. Отрицательное значение может получиться при вычитании, почему нет.

Автор: ShowMessage 20.12.2006, 02:40
При вычитании оно по полюбому отрицательным неполучится, всегда получается какое либо число положительное......

Автор: dimazu 20.12.2006, 02:53
А что такое ID ?
a:= StrToInt64(b)-((round(StrToInt64(ID)/128))*128);

Автор: Nicholas_S 20.12.2006, 02:55
ShowMessage, это еще почему? Очень даже легко. Запускаем Delphi, встаем курсором на слово Int64 и нажимаем F1. Читаем. 
Вопросы?

Автор: Coder 20.12.2006, 02:58
в любом случае у тебя здесь переполнения не случится если b и ID положительные, скорее всего в b или ID не верные значения, возможно с минусом.

Автор: Nicholas_S 20.12.2006, 03:03
люди, видимо, уже не помнят, какой-тип и какой диапазон представляет.
Отрицательное значение вполне может получиться, например, при вычете из 1 - 3 = -2.

Автор: ShowMessage 20.12.2006, 03:10
ошибся немного ID это b просто тут я привел в примере как b его а у меня оно ID, короче 
a:= StrToInt64(b)-((round(StrToInt64(b)/128))*128);
 как и говрил деление происходит без остатка поэтому полюбому отрицательным небудет результат...

Автор: Nicholas_S 20.12.2006, 03:31
ShowMessage, приведи конкретный пример, когда получается не то, что требуется (значение b, результат)

Автор: dimazu 20.12.2006, 05:00
Цитата

a:= StrToInt64(b)-((round(StrToInt64(b)/128))*128);
 как и говрил деление происходит без остатка поэтому полюбому отрицательным небудет результат...


В данном случае отрицательное значение ОБЯЗАТЕЛЬНО получится,
так работает round.
Eсли b=1234567890, то естессно получится отрицательный результат.
Т.е. во второй части будет (округленный b/128) * 128, что есть > b.  smile 

Это не переполнение, а неправильная формула.

Почему бы не мудрствуя, сделать так:  smile 
Код

 а:= StrToInt64(b) mod 128;

Автор: Winprogrammer 13.1.2007, 18:44
Весь прикол вчём, если число не помещается в переменную, оно урезается как-то по хитрому и в начале приписывается минус. Что бы решить вашу проблему нужно подключать длинную арифметику.  Полазайте по инету може найдёте чё. smile

Автор: Alexeis 13.1.2007, 20:02
int64 = 20  десятичных цифр!

Автор: VaiMR 13.1.2007, 20:48
Цитата(dimazu @ 20.12.2006,  05:00)
Почему бы не мудрствуя, сделать так:  smile 
Код

 а:= StrToInt64(b) mod 128;

Полностью согласен.

А можно пример работы (b и результат), так как при замене round на div: 
b=1234567890;
round(b/128)=9645061
b div 128=9645062

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)