Math-Calc-Units
view release on metacpan or search on metacpan
Units/Convert/Base.pm view on Meta::CPAN
# Returns 1 if the value is in range for the unit, 0.1 if the value is
# infinitely close to being in range, and decaying to 0.001 as the
# value approaches infinitely far away from the range.
#
# For the outside of range values, I convert to log space (so 1/400 is
# just as far away from 1 as 400 is). I then treat the allowed range
# as a one standard deviation wide segment of a normal distribution,
# and use appropriate modifiers to make the result range from 0.001 to
# 0.1.
#
# The above formula was carefully chosen from thousands of
# possibilities, by picking things at random and scribbling them down
# on a piece of paper, then pouring sparkling apple cider all over and
# using the one that was still readable.
#
# Ok, not really. Just pretend that I went to that much trouble.
#
sub range_score {
my ($self, $val, $unitName) = @_;
my $ranges = $self->get_ranges();
my $range = $ranges->{$unitName} || $ranges->{default};
Units/Rank.pm view on Meta::CPAN
BEGIN { @EXPORT_OK = qw(choose_juicy_ones render render_unit); }
use Math::Calc::Units::Convert qw(convert canonical);
use Math::Calc::Units::Convert::Multi qw(variants major_variants major_pref pref_score range_score get_class);
use strict;
# choose_juicy_ones : value -> ( value )
#
# Pick the best-sounding units for the given value, and compute the
# resulting magnitude and score. The total number returned is based on
# a magical formula that examines the rates of decay of the scores.
#
sub choose_juicy_ones {
my ($v, $options) = @_;
# Collect the variants of the value, together with their scores.
my @variants = rank_variants($v, $options); # ( < {old=>new}, score > )
# Remove duplicates
my %variants; # To remove duplicates: { id => [ {old=>new}, score ] }
for my $variant (@variants) {
( run in 0.256 second using v1.01-cache-2.11-cpan-26ccb49234f )