Hmmm, an interesting diversion...
Here's my version of both longdiv and longmul with a little test script. Dividing a random 1000 digit number by 222 and then multiplying the result by 222 is accurate to at least 12 decimal places for me. (The inaccuracy is due to the limit of accuracy for the fractional portion of the number while dividing.) And it takes much longer to print the number to the screen than it does to calculate it.
#!/usr/bin/perl use warnings; use strict; my $number; for(0..999) { $number .= int(rand 9); } print "$number\n\n"; print longdiv($number, 222) . "\n\n"; print longmul(longdiv($number, 222), 222) . "\n"; sub longdiv { my @digits = split //, shift; my $demoninator = shift; my $carry = 0; my $out = ''; my $numerator; while (@digits) { $numerator = shift @digits; $numerator += $carry * 10; $carry = $numerator % $demoninator; $out .= int($numerator / $demoninator) if @digits; } $out =~ s/^0+//; $out .= ($numerator / $demoninator); return $out; } sub longmul { my @digits = reverse split //, shift; my $multiplier = shift; my $out = ''; my ($digit, $progress); while (@digits) { $digit = shift @digits; if ($digit eq '.') { $out = '.' . $out; next; } $progress += $digit * $multiplier; $out = ($progress % 10) . $out; $progress = int($progress / 10); } $out = $progress . $out; return $out; }
In reply to Re: Reversed long division
by thundergnat
in thread Reversed long division
by Smoke
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |