Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинные числа не умещается в Int64, Как быть? 
:(
    Опции темы
ShowMessage
Дата 20.12.2006, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Здраствуйте!)

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

Код

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



Как можно сдеать такое вычисление? чтобы результат был нормальным....
Иногда получается норм а иногда когда число невлазит в Int64 и оно даёт мне число с минусом (отрицательное).
PM MAIL   Вверх
Nicholas_S
Дата 20.12.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



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

Это сообщение отредактировал(а) Nicholas_S - 20.12.2006, 02:30


--------------------
...все в мире относительно
PM   Вверх
ShowMessage
Дата 20.12.2006, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



При вычитании оно по полюбому отрицательным неполучится, всегда получается какое либо число положительное......
PM MAIL   Вверх
dimazu
Дата 20.12.2006, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



А что такое ID ?
a:= StrToInt64(b)-((round(StrToInt64(ID)/128))*128);

PM MAIL   Вверх
Nicholas_S
Дата 20.12.2006, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



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


--------------------
...все в мире относительно
PM   Вверх
Coder
Дата 20.12.2006, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



в любом случае у тебя здесь переполнения не случится если b и ID положительные, скорее всего в b или ID не верные значения, возможно с минусом.
PM MAIL   Вверх
Nicholas_S
Дата 20.12.2006, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



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


--------------------
...все в мире относительно
PM   Вверх
ShowMessage
Дата 20.12.2006, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



ошибся немного ID это b просто тут я привел в примере как b его а у меня оно ID, короче 
a:= StrToInt64(b)-((round(StrToInt64(b)/128))*128);
 как и говрил деление происходит без остатка поэтому полюбому отрицательным небудет результат...
PM MAIL   Вверх
Nicholas_S
Дата 20.12.2006, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



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


--------------------
...все в мире относительно
PM   Вверх
dimazu
Дата 20.12.2006, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Цитата

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


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

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

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

 а:= StrToInt64(b) mod 128;


Это сообщение отредактировал(а) dimazu - 20.12.2006, 06:11
PM MAIL   Вверх
Winprogrammer
Дата 13.1.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 23.3.2006
Где: ::Россия.РСО-Алан ия.Владикавка

Репутация: нет
Всего: нет



Весь прикол вчём, если число не помещается в переменную, оно урезается как-то по хитрому и в начале приписывается минус. Что бы решить вашу проблему нужно подключать длинную арифметику.  Полазайте по инету може найдёте чё. smile
--------------------
Я не понял Вашего вопроса, но я Вам на него отвечу…-----------
Uploading файлов без гемороя - это просто!!!
Winprogrammer.ifolder.ru
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Alexeis
Дата 13.1.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



int64 = 20  десятичных цифр!


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VaiMR
Дата 13.1.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 25.11.2006

Репутация: нет
Всего: 2



Цитата(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 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.