Your skill will accomplishwhat the force of many cannot PerlMonks

### Re^2: negative numbers when doing multiplications?

by chuckbutler (Prior)
 on Mar 26, 2010 at 14:03 UTC ( #831154=note: print w/replies, xml ) Need Help??

If you are on a 32-bit system, you must use Math::BigInt. The following returns 2348273369088.

```#!/usr/bin/perl
use strict;
use warnings;
use integer;
use Math::BigInt;

my %iupac_dgn;
my @iupac_code = ('M','R','W','S','Y','K','V','H','D','B','N');
my @iupac_den = ('2','2','2','2','2','2','3','3','3','3','4');
@iupac_dgn{@iupac_code}=@iupac_den;

my \$string = 'GGNMDNNSNNNNDBNVWVSMNNHYNBNG';
my @residues = split(//, \$string);
my \$degeneracy = Math::BigInt->new( 1 );

foreach my \$residues(@residues){
\$degeneracy *= \$iupac_dgn{\$residues} || 1;
}

printf "%28s, %30s\n", \$string, \$degeneracy;

Update: I will concur with Tye as long as the result is less than 2 ** 49 on a 32b machine/implementation. Thanks.

Good Luck. -c

Replies are listed 'Best First'.
Re^3: negative numbers when doing multiplications? (float++)
by tye (Sage) on Mar 26, 2010 at 20:46 UTC
If you are on a 32-bit system, you must use Math::BigInt.

Don't be foolish. :) Just don't use the stupid integer.pm module:

```#!/usr/bin/perl
use strict;
use warnings;
# use integer;

my %iupac_dgn;
my @iupac_code=('M','R','W','S','Y','K','V','H','D','B','N');
my @iupac_den=('2','2','2','2','2','2','3','3','3','3','4');
@iupac_dgn{@iupac_code}=@iupac_den;

my \$string = 'GGNMDNNSNNNNDBNVWVSMNNHYNBNG';
my @residues = split( //, \$string );
my \$degeneracy = 1;

foreach my \$residues(  @residues  ) {
if(  grep( m/^\$residues\$/, keys %iupac_dgn )  ) {
my \$factor = \$iupac_dgn{\$residues};
\$degeneracy = (\$factor * \$degeneracy);
}
}

printf "%28s, %30d", \$string, \$degeneracy;
__END__
GGNMDNNSNNNNDBNVWVSMNNHYNBNG,                  2348273369088

- tye

Part of the problem here may also be the printf "%d".  I just tried it (without use integer) on a 32-bit system/perl*, and the printf simply outputs -1, while print \$degeneracy outputs the correct value without problems.

(AFAICT (i.e. using ltrace), Perl comes with its own printf implementation, and doesn't call the one provided by the system's libc, so this should be system-independent.)

___

* i686-linux, compilation settings from perl -V:

```    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=1
+2
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
+ lseeksize=8

Part of the problem here may also be the printf "%d".

Yes, as I recently explained. Solution included.

Create A New User
Node Status?
node history
Node Type: note [id://831154]
help
Chatterbox?
 [karlgoethebier]: The early bird catches the worm holli enters he monastery hall, freezing but happy to have built the most beautiful snowman in the history of mankind [holli]: tbh, the thing looks more like quasimode but hey, the thought matters. and it has blue LEDs as eyes [holli]: we had solid 8cm fresh snow overnight. that is quite unusual for the area

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (8)
As of 2017-12-18 05:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
What programming language do you hate the most?

Results (467 votes). Check out past polls.

Notices?