Как работать с большими числами в STL?

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
alex2k385
Posts: 5
Joined: Fri May 28, 2021 7:15 am

Как работать с большими числами в STL?

Post by alex2k385 »

Добрый день.
Прошу помощи.
Есть переменная в DB, тип DWORD, формат без знаковый - целый.
Записываю большое число в эту переменную, например: 3 010 174 720.
Это число больше чем 2 147 483 647, соответственно при чтении этой переменной, получаю - 1 284 792 576.
Мне необходимо разложить исходное значение на составляющие.
Первым делом выяснить какая цифра самая первая, т.е. для моего примера это "3"
Но в связи с переполнением, нужна математика, вот тут я что-то и завяз....
Понимаю, что 2 147 483 647 - 1 284 792 576 = 862 691 071 + 2 147 483 647 = 3 010 174 718 + 2 = мое исходное число.
Но как произвести эти вычисления не могу сообразить....
Как-то конвертировать из знакового в без знаковое?
Из DB читаю через указатель: L DBD[AR1, P#0.0]
Может кто-то занимался, такими преобразованиями и вычислениями, подскажите направление куда копать.
CoMod
Site Admin
Posts: 3992
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia

Re: Как работать с большими числами в STL?

Post by CoMod »

в Степ7 есть операции для DINT/INT и DWORD/WORD
для целых знаковых чисел DINT Сравнить<>, Сложить +, Вычесть -, Умножить *,...
для безнаковых слов DWORD Наложить OR, Сочетать AND, отXORить
через MOVE можно перекинуть значение в переменную другого типа
Image

В TIА Портале для S7-1500 появился новый 64-х битный тип данных L... ну очень большие числа
LWORD#16#0000_0000_5F52_DE8B
LW#16#0000_0000_5F52_DE8B

LINT#+154_325_790_816_159
LINT#10#+154_325_790_816_159
Dfcz
Posts: 878
Joined: Tue Dec 26, 2006 5:21 am
Location: Russia

Re: Как работать с большими числами в STL?

Post by Dfcz »

Не понятно, что надо делать с большими числами?
Если накапливать, то я выкручивался записывая отдельно множитель.
Если арифметические действия, то я уменьшал точность расчетов.
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Как работать с большими числами в STL?

Post by Rex2701 »

В PCS7 APL есть блоки для работы с 64-битными числами. Возможности куцые, но что есть, то есть.

AddInt64 - сложение двух Int64
AddR64 - сложение двух Real64
DiToInt64 - преобразование DINT в Int64
Int64ToDi - преобразование Int64 в DINT
NegInt64 - смена знака для Int64
NegR64 - смена знака для Real64
R64ToReal - преобразование Real64 в обычный Real
RealToR64 - преобразование Real в Real64
ShLeInt64 - сдвиг битов влево в Int64
ShRiInt64 - сдвиг битов вправо в Int64

Real64 представлен как структура из двух DWORD
Int64 представлен как структура из двух DINT

Другой путь - покурить документацию IEEE754-2008 и написать реализацию представления чисел и четырёх арифметических действий самому.
Dfcz
Posts: 878
Joined: Tue Dec 26, 2006 5:21 am
Location: Russia

Re: Как работать с большими числами в STL?

Post by Dfcz »

У него процессор не может скушать число больше своего регистра, поэтому никакие готовые функции не помогут.
Надо полюбасу уменьшать число, чтобы влезло в регистр.
Rex2701
Posts: 374
Joined: Wed Oct 13, 2010 8:44 am
Location: Russian Federation

Re: Как работать с большими числами в STL?

Post by Rex2701 »

alex2k385 wrote: Fri Nov 05, 2021 10:05 amМожет кто-то занимался, такими преобразованиями и вычислениями, подскажите направление куда копать.
Для начала в сторону изучения такой вещи как дополнительный код.
А дальше надо понимать, что за аппаратные границы +/- 2.1 млрд. выйти невозможно.
Только если полностью писать свои блоки-обработчики чисел и действий с ними. Но перед выводом куда-либо всё равно придётся ужиматься до аппаратной размерности типа данных.