########################################################################### Math::Ryu enables stringification of perl's floating point NV values such that: 1) the condition ("$nv" == $nv) is always true (except, of course, when $nv is NaN); 2) the number of significant decimal digits used is the least possible needed for condition 1) to be met. It may not be immediately apparent, but neither perl's print() nor printf() function will always satisfy both 1) and 2). Example 1: $ perl -le '$nv = 1 / 3; print "WTF" if "$nv" != $nv;' WTF The problem there is that perl has, in stringifying $nv, rounded it to too few significant digits - thereby breaking the equivalence. Perl can also present more siginificant digits than are needed. The following example pertains to perls whose NV type is "double", though the same sort of thing occurs with other NV types. Example 2: $ perl -le 'print 2 ** -1074;' 4.94065645841247e-324 $ perl -le 'print "OK" if "5e-324" == 2 ** -1074;' OK As we can see, perl presents us with a value of "4.94065645841247e-324", though "5e-324" will suffice. Math::Ryu's nv2s($nv) function returns a string that avoids both these types of nonsense: $ perl -MMath::Ryu=":all" -le 'print "OK" if nv2s(1 / 3) == 1 / 3;' OK $ perl -MMath::Ryu=":all" -le 'print nv2s(2 ** -1074);' 5e-324 This module uses the Ryu C implementation, which is included with this module's source (in the Ryu_Library/ryu folder). It is therefore unnecessary to download that Ryu code - but, should you wish to grab it, it's also available at: https://github.com/ulfjack/ryu/tree/master/ryu If `perl -V:nvtype` reports anything other than 'double', then the C compiler that built perl (and which will build this module) must provide the '__uint128_t' data type. This generally means that, if you have a 32-bit build of perl, you won't be able to build this module if 'nvtype' is other than 'double'. (It is, of course, quite rare to have a 32-bit build of perl with an 'nvtype' that is not 'double'.) There should , however, be no such problem with 64-bit builds - unless, perhaps, you're using a particularly old 64-bit C toolset, or running on a particularly uncooperative system.