powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Умножение больших чисел.
13 сообщений из 13, страница 1 из 1
Умножение больших чисел.
    #39260688
Доброго времени суток.
Подскажите как в FB2.5 в ХП умножить 2 числа Integer, чтобы если результат не поместился в Integer, то его обрезало (как в Делфи).
Пробовал так:
Код: plsql
1.
k = 4294967295 * 4294967295;


и так:
Код: plsql
1.
k = bin_and(4294967295 * 4294967295, 0xFFFFFFFF);


не работает даже так:
Код: plsql
1.
k = 65536 * 65536;


Ругается:
Код: plsql
1.
2.
3.
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
numeric value is out of range.
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260693
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто_кодер1,

куда обрезало?
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260699
Если в делфи умножить Integer на Integer, в результат (если ожидается тоже Integer) попадут младшие 4 байта. Можно как-то это реализовать в ХП или нужно писать UDF?
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260704
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
k = bin_and(65536 * 65536, 0x0FFFFFFFF);
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260708
Не-а. :(
k = bin_and(6553 4 * 65536, 0x0FFFFFFFF);
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260718
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто_кодер1,

зачем такие извраты? Я о попытке впихнуть невпихуемое".
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260723
Кстати это неправильно работает (не обрезает вообще):
Код: sql
1.
2.
k = bin_and(2814749 * 976710655, 0xFFFFFFFF);
, где k bigint


так работает:
Код: sql
1.
k = bin_and(2814749 * 976710655, 0xFFFFFFF);



В описании функции BIN_AND( <number> [, <number> ...] ), где number = непонятный тип.

DarkMasterзачем такие извраты? Я о попытке впихнуть невпихуемое".
Нужно кое-какие расчеты добавить, а на чужом сервере проще написать ХП, чем UDF.
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260732
Просто_кодер1Кстати это неправильно работает...
тут я тупанул, пардон:
Код: sql
1.
2.
3.
select 0xFFFFFFFF, bin_and(2814749 * 976710655, 0xFFFFFFFF),
       0x0FFFFFFFF, bin_and(2814749 * 976710655, 0x0FFFFFFFF)
from rdb$database
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260750
Используя BigInt вроде все получилось, вот только как впихнуть младшие 4 байта BigInt в Integer?
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260778
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто_кодер1вот только как впихнуть младшие 4 байта BigInt в Integer?После обнуления старших бит банальным присваиванием.
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260780
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто_кодер1,
Код: sql
1.
Cast((k mod 0xFFFF) as Integer) ?


или как там остаток от деления
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260816
Ivan_PisarevskyПросто_кодер1вот только как впихнуть младшие 4 байта BigInt в Integer?После обнуления старших бит банальным присваиванием.
Если бы....
Так ошибка:
Код: sql
1.
select cast(bin_and(2814749 * 976710655, 0x0FFFFFFFF) as integer) from rdb$database


и так ошибка:
Код: sql
1.
select cast(bin_and(2814749 * 976710655, 0xFFFFFFFF) as integer) from rdb$database



Cobalt747Просто_кодер1,
Код: sql
1.
Cast((k mod 0xFFFF) as Integer) ?


или как там остаток от деления
Так результат 0:
Код: sql
1.
select cast(mod(bin_and(2814749 * 976710655, 0xFFFFFFFF), 0xFFFFFFFF)  as integer) from rdb$database


так ошибка:
Код: sql
1.
select cast(mod(bin_and(2814749 * 976710655, 0xFFFFFFFF), 0x0FFFFFFFF)  as integer) from rdb$database
...
Рейтинг: 0 / 0
Умножение больших чисел.
    #39260826
Кажется понял в чем проблема при преобразовании. Может кому пригодится.
Integer это -2147483648 до 2147483647. Именно в этот диапазон и нужно впихивать 0xFFFFFFFF. Т.е. если BigInt больше 2147483647, то делаем из него отрицательное, и уже его преобразовываем в Integer.
Всем спасибо.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Умножение больших чисел.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]