in reply to Re^2: negative numbers when doing multiplications?
in thread negative numbers when doing multiplications?

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        

Replies are listed 'Best First'.
Re^4: negative numbers when doing multiplications? (float++)
by almut (Canon) on Mar 26, 2010 at 22:16 UTC

    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.

        ...which made me wonder why printf "%d" (apparently) did work for tye — I''m assuming he used a 32-bit perl, because personally I cannot replicate the issue with use integer on any of the 64-bit perls that I tried.