Skip Menu |

This queue is for tickets about the XML-Compile CPAN distribution.

Report information
The Basics
Id: 85000
Status: resolved
Priority: 0/
Queue: XML-Compile

People
Owner: Nobody in particular
Requestors: jamdavis [...] franklinamerican.com
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: (no value)
Fixed in: 1.32



Subject: XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN
Date: Thu, 2 May 2013 09:55:33 -0500 (CDT)
To: <bug-XML-Compile [...] rt.cpan.org>
From: James Davis <jamdavis [...] franklinamerican.com>
This is using XML::Compile::Schema::BuiltInFacets v1.32 on 32-bit perl 5.10.1. It seems to work properly on 64-bit perl 5.16.1, but I suspect it's the "64-bit" part that's important. For testing, I copied _maybe_big into a separate file and passed it the following: say _maybe_big(undef, {}, "999999.99"); say _maybe_big(undef, {}, "9999999.99"); Result: 999999.99 NaN It looks like the first test for [.eE] is succeeding, but the number's short enough to not require Math::BigFloat -- so it falls through to the next if/else and tries to return a Math::BigInt for 9999999.99. It looks like changing that second if to an elsif would do the trick, but it's likely I haven't thought this through sufficiently. perl -V output: ------------------------------ Summary of my perl5 (revision 5 version 10 subversion 1) configuration: Platform: osname=linux, osvers=2.6.24-28-server, archname=i486-linux-gnu-thread-multi uname='linux roseapple 2.6.24-28-server #1 smp wed aug 18 21:17:51 utc 2010 i686 gnulinux ' config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef use64bitint=undef, use64bitall=undef, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', optimize='-O2 -g', cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include' ccversion='', gccversion='4.4.3', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=4, prototype=define Linker and Libraries: ld='cc', ldflags =' -fstack-protector -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib /usr/lib64 libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt perllibs=-ldl -lm -lpthread -lc -lcrypt libc=/lib/libc-2.11.1.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1 gnulibc_version='2.11.1' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector' Characteristics of this binary (from libperl): Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP USE_ITHREADS USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API Built under linux Compiled at Apr 22 2011 18:17:20 %ENV: PERL5LIB="/home/bna/jamdavis/perl5/lib/perl5" PERLDB_OPTS="windowSize=40" PERL_CPANM_OPT="--local-lib=~/perl5" @INC: /home/bna/jamdavis/perl5/lib/perl5/i486-linux-gnu-thread-multi /home/bna/jamdavis/perl5/lib/perl5 /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl ------------------------------ James Davis Show quoted text
______________________________________________________________________ The information contained in and transmitted with this communication is strictly confidential, is intended only for use of the intended recipient, and is the property of Franklin American Mortgage Company. If you are not the intended recipient, you are hereby notified that any use of the information contained in or transmitted with the communication or distribution, dissemination or copying of this communication is strictly prohibited by law. If you have received this communication in error, please immediately return this communication to the Sender and delete the original message and any copy of it in your possession.
Subject: Re: [rt.cpan.org #85000] XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN
Date: Thu, 2 May 2013 17:44:33 +0200
To: James Davis via RT <bug-XML-Compile [...] rt.cpan.org>
From: Mark Overmeer <solutions [...] overmeer.net>
* James Davis via RT (bug-XML-Compile@rt.cpan.org) [130502 14:56]: Show quoted text
> Thu May 02 10:55:52 2013: Request 85000 was acted upon. > Transaction: Ticket created by jamdavis@franklinamerican.com > Queue: XML-Compile > Subject: XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN > 5.10.1. > > It seems to work properly on 64-bit perl 5.16.1, but I suspect it's the > "64-bit" part that's important. > > For testing, I copied _maybe_big into a separate file and passed it the > following: > say _maybe_big(undef, {}, "999999.99"); > say _maybe_big(undef, {}, "9999999.99");
Can you tell me what DBL_MAX_DIG and DBL_MAX_EXP (from POSIX) are on your platform? The logic seems insufficient. sub _maybe_big($$$) { my ($path, $args, $value) = @_; ... $value =~ s/\s//g; if($value =~ m/[.eE]/) { my $c = $value; my $exp = $c =~ s/[eE][+-]?(\d+)// ? $1 : 0; for($c) { s/\.//; s/^[-+]// } return Math::BigFloat->new($value) if length($c) > DBL_MAX_DIG || $exp > DBL_MAX_EXP; The digits befor the '.' should probably be added to $exp. my $exp = $c =~ s/[eE][+-]?(\d+)// ? $1 : 0; $c =~ /^[-+]?([0-9]*)/; return Math::BigFloat->new($value) if length($c) > DBL_MAX_DIG || $exp + length($1) > DBL_MAX_EXP; What do you think? -- Regards, MarkOv ------------------------------------------------------------------------ Mark Overmeer MSc MARKOV Solutions Mark@Overmeer.net solutions@overmeer.net http://Mark.Overmeer.net http://solutions.overmeer.net
Subject: Re: [rt.cpan.org #85000] XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN
Date: Thu, 2 May 2013 17:58:57 +0200
To: Mark Overmeer via RT <bug-XML-Compile [...] rt.cpan.org>
From: Mark Overmeer <solutions [...] overmeer.net>
* Mark Overmeer via RT (bug-XML-Compile@rt.cpan.org) [130502 15:45]: Show quoted text
> The digits befor the '.' should probably be added to $exp. > > my $exp = $c =~ s/[eE][+-]?(\d+)// ? $1 : 0; > $c =~ /^[-+]?([0-9]*)/; > return Math::BigFloat->new($value) > if length($c) > DBL_MAX_DIG > || $exp + length($1) > DBL_MAX_EXP;
Actually, it is both above AND that the constants are not taken from POSIX.pm but hardcoded in the file... stupid incompleteness in the development. use POSIX qw/DBL_DIG DBL_MAX_10_EXP/; my $exp = $c =~ s/[eE][+-]?([0-9]+)// ? $1 : 0; my $pre = $c =~ /^[-+]?([0-9]*)/ ? length($1) : 0; return Math::BigFloat->new($value) if $pre >= DBL_DIG || $pre+$exp >= DBL_MAX_10_EXP; That's better. -- Thanks for reporting, MarkOv ------------------------------------------------------------------------ Mark Overmeer MSc MARKOV Solutions Mark@Overmeer.net solutions@overmeer.net http://Mark.Overmeer.net http://solutions.overmeer.net
Subject: Re: [rt.cpan.org #85000] XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN
Date: Thu, 2 May 2013 11:29:25 -0500 (CDT)
To: bug-XML-Compile [...] rt.cpan.org
From: James Davis <jamdavis [...] franklinamerican.com>
I think the trouble is that the first if block succeeds (it's a float), but it's not big enough to require Math::BigFloat so it leaves the if. Then it moves on to the next if/else that assumes we're dealing with an integer. length(9999999.99) == length(2147483647) so it thinks it needs a BigInt, and .99 -> NaN. That's why I think changing the if(negative){...}else{...} block to start with an elsif() would do the trick. Also: DBL_DIG => 15 DBL_MAX_10_EXP => 308 INT_MIN => -2147483648 INT_MAX => 2147483647 -- Jim Show quoted text
----- Original Message ----- From: "Mark Overmeer via RT" <bug-XML-Compile@rt.cpan.org> To: jamdavis@franklinamerican.com Sent: Thursday, May 2, 2013 10:59:18 AM Subject: Re: [rt.cpan.org #85000] XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN <URL: https://rt.cpan.org/Ticket/Display.html?id=85000 > * Mark Overmeer via RT (bug-XML-Compile@rt.cpan.org) [130502 15:45]:
> The digits befor the '.' should probably be added to $exp. > > my $exp = $c =~ s/[eE][+-]?(\d+)// ? $1 : 0; > $c =~ /^[-+]?([0-9]*)/; > return Math::BigFloat->new($value) > if length($c) > DBL_MAX_DIG > || $exp + length($1) > DBL_MAX_EXP;
Actually, it is both above AND that the constants are not taken from POSIX.pm but hardcoded in the file... stupid incompleteness in the development. use POSIX qw/DBL_DIG DBL_MAX_10_EXP/; my $exp = $c =~ s/[eE][+-]?([0-9]+)// ? $1 : 0; my $pre = $c =~ /^[-+]?([0-9]*)/ ? length($1) : 0; return Math::BigFloat->new($value) if $pre >= DBL_DIG || $pre+$exp >= DBL_MAX_10_EXP; That's better. -- Thanks for reporting, MarkOv ------------------------------------------------------------------------ Mark Overmeer MSc MARKOV Solutions Mark@Overmeer.net solutions@overmeer.net http://Mark.Overmeer.net http://solutions.overmeer.net
______________________________________________________________________ The information contained in and transmitted with this communication is strictly confidential, is intended only for use of the intended recipient, and is the property of Franklin American Mortgage Company. If you are not the intended recipient, you are hereby notified that any use of the information contained in or transmitted with the communication or distribution, dissemination or copying of this communication is strictly prohibited by law. If you have received this communication in error, please immediately return this communication to the Sender and delete the original message and any copy of it in your possession.

Message body is not shown because sender requested not to inline it.

Subject: Re: [rt.cpan.org #85000] XML::Compile::Schema::BuiltInFacets::_maybe_big reports 9999999.99 as NaN
Date: Thu, 2 May 2013 20:43:18 +0200
To: James Davis via RT <bug-XML-Compile [...] rt.cpan.org>
From: Mark Overmeer <mark [...] overmeer.net>
* James Davis via RT (bug-XML-Compile@rt.cpan.org) [130502 16:29]: Show quoted text
> Queue: XML-Compile > Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=85000 > > > length(9999999.99) == length(2147483647) > so it thinks it needs a BigInt, and .99 -> NaN. That's why I think > changing the if(negative){...}else{...} block to start with an elsif() > would do the trick.
Yes, yes, and yes. Well, three bugs solved in 1 report ;-) -- Regards, MarkOv ------------------------------------------------------------------------ Mark Overmeer MSc MARKOV Solutions Mark@Overmeer.net solutions@overmeer.net http://Mark.Overmeer.net http://solutions.overmeer.net
Got solved in 1.32