This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Revise \p{nv=float} lookup
authorKarl Williamson <khw@cpan.org>
Mon, 30 Apr 2018 03:08:37 +0000 (21:08 -0600)
committerKarl Williamson <khw@cpan.org>
Mon, 25 Jun 2018 13:33:29 +0000 (07:33 -0600)
commit0426f63574a2379bce80c33f85f158ae093be0c2
treeb1dae5cd535465fbd78b01f364ae9b9732f2eb55
parent7a6f68415b295f4315b6181237ea0000dd706cd5
Revise \p{nv=float} lookup

The Numeric Value property allows one to find all code points that have
a certain numeric value.  An example would be to match against any
character in any of the world's scripts which is effectively equivalent
to the digit zero.

It is documented that we accept either integers (like \p{nv=9}) or
rationals (like \p{nv=1/2}).  But we also accept floating point
representations in case a conversion to numeric has happened.  I think
it is right that we not document these and their vagaries.  One reason
is that Unicode might someday create a new rational number that, to the
precision we currently accept, is indistinguishable from an existing
one, so that we would have to increase the precision.

But there was a bug I introduced years ago.  I thought that in order for
a float to be considered to match a close rational, that 3 significant
digits of precision would be needed, like .667 to match 2/3.  That still
seems reasonable.   But I didn't implement that concept.  Instead, prior
to this commit, it was 3 (not necessarily significant) digits, so that
for 1/160, it would match .001.

This commit corrects that, and makes the lookup simpler.  mktables will
use sprintf %e to get the number normalized and having the 3 signicant
digits required.  At runtime, a floating number is normalized using the
same format, and the result looked up in a hash.  This eliminates the
need to worry about matching within some epsilon.

Further simplifications in utf8_heavy.pl are achieved by making a more
precise definition as to what an acceptable number looks like, so we
don't have to check later to see if what matched really was one.
charclass_invlists.h
lib/unicore/mktables
lib/utf8_heavy.pl
regcharclass.h
uni_keywords.h