newton_s_method.pl 471 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/perl
  2. # Approximate nth-roots using Newton's method.
  3. use 5.010;
  4. use strict;
  5. use warnings;
  6. use lib qw(../lib);
  7. use Math::AnyNum qw(:overload approx_cmp);
  8. sub nth_root {
  9. my ($n, $x) = @_;
  10. my $r = 0.0;
  11. my $m = 1.0;
  12. until (approx_cmp($m, $r) == 0) {
  13. $r = $m;
  14. $m = (($n - 1) * $r + $x / $r**($n - 1)) / $n;
  15. }
  16. return $r;
  17. }
  18. say nth_root(2, 2);
  19. say nth_root(3, 125);
  20. say nth_root(7, 42**7);
  21. say nth_root(42, 987**42);