|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Vyacheslav Ignatyuk 2:5020/400 28 Oct 2000 22:38:41 To : All Subject : Re: Помогите -------------------------------------------------------------------------------- "Alex Sverdlin" <Alex.Sverdlin@p117.f1057.n5020.z2.fidonet.org> wrote in message news:972740563@p117.f1057.n5020.z2.ftn... > Hi, All! > > Как заставить пеpл считать выpажение в 32-битных целых? Хочу получить pезультат > умножения с пеpеполнением такой же, как в дpугих языках пpогpаммиpования. > > Пpимеp: > 0x7F000001 * 0x8088405 + 1 > должно быть 2130706433, а perl выдает все, что угодно, но не это :( > пpобовал sprintf "%lu", ... - та же фигня... В общем, нормального решения не получиш. Бился я с этим в части вычисления хеширующей функции для ключей. Есть один выход (не считая Math::BigInt, который просто медленный, хотя это для тебя может быть и не критично). Вроде как перл сам в себе использует 32 битные целые. Для того, чтобы получить вычисление с переполнением, обрами свой блок прагмой use integer: use integer; Делай что-то там...... no integer; (не обязательно - смотря что тебе надо дальше. Или если конец блока) Однако в этом случае все вычисления - знаковые, что может быть не то, что тебе надо - учитывай это. Для меня это было не критично, ибо использовались только битовые операции. В конце приводи все к uint32 через unpack pack, или так: $result = 2**32 - $result if $result < 0 Да, 2**32 - это константа, а не выражение - просто все знаки не помню ;-) Да, по опыту говорю, что все математические операции безумно медленны, так что решай сам - а насколько тебе это надо. Может лучше о XS подумать? Vyacheslav Ignatyuk > Помогите, плз, буду очень пpизнателен! > > WBR, Alex. > [underlings] -- Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6488bdeda523.html, оценка из 5, голосов 10
|