#!perl -l use strict; use warnings; use Math::MPFR qw(:mpfr); my $e=107; my $v = "5.34"; Rmpfr_set_default_prec(1000); mpfr($v, $e); print lanx($v, $e); # Wins for 5.34 ** 107 & 5.34 ** 100. print menezes($v, $e); # Wins for 5.231 ** 107 & 5.231 ** 100. print by_mul($v, $e); # Wins for 5.35 ** 107 & 5.35 ** 100. sub mpfr { my $val = shift; my $exp = shift; my $ret = Math::MPFR->new($val); $ret **= $e; Rmpfr_out_str($ret, 10, 15, MPFR_RNDN); printf "\n"; } sub lanx { my $val = shift; $val += 0; my $exp = shift; my $ret = 1; for my $bit (reverse split //,sprintf '%b',$exp) { $ret *= $val if $bit; $val **= 2; } return $ret; } sub menezes { my $val = shift; $val += 0; my $exp = shift; my $ret = 1; for my $bit (split //,sprintf '%b',$exp) { $ret **= 2; $ret *= $val if $bit; } return $ret; } sub by_mul { my $val = shift; $val += 0; my $exp = shift; my $ret = 1; $ret *= $val for 1..$exp; return $ret; }