#!/usr/bin/env perl use utf8; ############################################################################### # This program demonstrates a significant digits rounding function. # # Copyright © 2017 Richard Lesh. All rights reserved. ############################################################################### use Math::Trig qw(pi); use POSIX qw(floor log10); use Utils; use strict; use warnings; sub round_sig_dig { my ($value, $sigdigits) = @_; if ($value == 0.0) { return 0.0; } my $p = ((10.0) ** ($sigdigits - int(floor(log10(abs($value)))) - 1)); return floor($value * $p + 0.5) / $p; } MAIN: { binmode(STDOUT, ":utf8"); binmode(STDERR, ":utf8"); binmode(STDIN, ":utf8"); # Test with π for (my $sd = 1; $sd <= 16; ++$sd) { print Utils::messageFormat("π to \{0:d\} significant digits: \{1:.16f\}", $sd, round_sig_dig(pi(), $sd)), "\n"; } # Test with ℯ for (my $sd = 1; $sd <= 16; ++$sd) { print Utils::messageFormat("ℯ to \{0:d\} significant digits: \{1:.16f\}", $sd, round_sig_dig(exp(1.), $sd)), "\n"; } # Test with 1/π for (my $sd = 1; $sd <= 16; ++$sd) { print Utils::messageFormat("1/π to \{0:d\} significant digits: \{1:.16e\}", $sd, round_sig_dig(1.0 / pi(), $sd)), "\n"; } # Test with 1e-6/e for (my $sd = 1; $sd <= 16; ++$sd) { print Utils::messageFormat("1e-6/e to \{0:d\} significant digits: \{1:.16e\}", $sd, round_sig_dig(1e-6 / exp(1.), $sd)), "\n"; } }