| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Длинные числа не умещается в Int64 |
| Автор: ShowMessage 20.12.2006, 02:03 | ||
| Здраствуйте!) у меня есть 10 ти значное число и я делаю матиматиские вычисления и оно невлазит число в Int64 к примеру
Как можно сдеать такое вычисление? чтобы результат был нормальным.... Иногда получается норм а иногда когда число невлазит в 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 | ||||
В данном случае отрицательное значение ОБЯЗАТЕЛЬНО получится, так работает round. Eсли b=1234567890, то естессно получится отрицательный результат. Т.е. во второй части будет (округленный b/128) * 128, что есть > b. Это не переполнение, а неправильная формула. Почему бы не мудрствуя, сделать так:
|
| Автор: Winprogrammer 13.1.2007, 18:44 |
| Весь прикол вчём, если число не помещается в переменную, оно урезается как-то по хитрому и в начале приписывается минус. Что бы решить вашу проблему нужно подключать длинную арифметику. Полазайте по инету може найдёте чё. |
| Автор: Alexeis 13.1.2007, 20:02 |
| int64 = 20 десятичных цифр! |
| Автор: VaiMR 13.1.2007, 20:48 | ||||
Полностью согласен. А можно пример работы (b и результат), так как при замене round на div: b=1234567890; round(b/128)=9645061 b div 128=9645062 |