2009-12-08 14 views
10

Sono un perl newbie,Come posso eseguire l'aritmetica a 64 bit in Perl?

Posso semplicemente utilizzare l'aritmetica a 64 bit in Perl?

Per esempio

$operand1 = 0xFFFFFFFFFFFF; # 48 bit value 
$operand2 = 0xFFFFFFFFFFFF; # 48 bit value 

$Result = $operand1 * $operand2; 
  • sto fondamentalmente alla ricerca di un sostituto per il int64_t in perl.
  • C'è un modo per citare, se la variabile è firmata o non firmata?
+1

Vuoi veramente a 64 bit aritmetica o grandi numeri? Vuoi che trabocchi dopo 64 bit? –

risposta

13

Sì, tuttavia è necessario avere Perl compilato con supporto a 64 bit.

+6

"use bigint" farà in modo che funzioni sempre. (Se si desidera la velocità assoluta, si è scelto il linguaggio di programmazione sbagliato.) – jrockway

+4

Perl è spesso utilizzato in bioinformatica e in altri campi che richiedono prestazioni elevate. Se i tuoi numeri sono sicuri di adattarsi entro 64 bit, allora questa risposta creerà un codice migliore. Assicurati di usare una versione recente di Perl e potresti volerlo compilare tu stesso. "Il supporto a 64 bit ora è considerato maturo" http://dev.perl.org/perl5/news/2002/07/18/580ann/ – Colin

+7

Anche con supporto a 64 bit, è necessario un ' usa intero; 'per evitare di ottenere un risultato in virgola mobile (arrotondato) e ottenere invece un risultato intero (troncato di bit alti). – ysth

5

Sì, Perl gestisce automaticamente l'intero aritmetico intero per te. Tuttavia, Perl non offre una distinzione tra tipi firmati e non firmati (non ce n'è bisogno, dal momento che non ci sono limiti fissi su un intervallo intero di grandi dimensioni).

La pagina di manuale perlnumber contiene ulteriori informazioni sui diversi formati numerici supportati da Perl.

+0

Non è chiaro cosa intendi per "distinzione tra valori firmati e non firmati"? – ysth

+0

Giusto, avrei dovuto dire "tipi" anziché "valori". Fisso. –

10

Vedi bigint:

trasparente il supporto BigInteger per Perl ...

Tutti gli operatori (incluse le operazioni matematiche di base), tranne l'operatore gamma .. sono sovraccaricati. Le costanti integer vengono create come BigInts corretti.

Le costanti di virgola mobile vengono troncate all'intero. Anche tutte le parti e i risultati delle espressioni vengono troncati.

differenza integer, questo pragma crea costanti intere che sono limitati solo nella loro dimensione dalla memoria disponibile e il tempo di CPU ...

+0

+1 grazie, ma non ho potuto usare funzioni come hex() ecc ~~~ – Alphaneo

+0

Alphaneo, in realtà si può fare '$ a = Math :: BigInt-> new (" 0x ". $ Your_int)' and '$ a-> as_hex() ' – osgx

0

essere consapevoli, a 64 bit aritmetica in Perl è uno, ma ciò che viene visualizzato da sprintf% d% u e% s, è il secondo. La versione perl attuale supporta 64 bit senza problemi, ma sprintf% d formato non,% b allo stesso modo.

0

use bigint farà sì che Perl gestisca correttamente gli interi di dimensione arbitraria senza overflow di interi.

Eg .:

use bigint; 
print 1 << 256; 

stamperà:

115792089237316195423570985008687907853269984665640564039457584007913129639936 
Problemi correlati