Value out of range on xs:integer?
Hello all,
Performing this query...
xquery version "1.0";
declare namespace tst="http://test.racspace.com";
declare function tst:factorial ($input as xs:integer) as xs:integer {
let $result := tst:multiply(1 to $input)
return $result
};
declare function tst:multiply ($inputs as xs:integer*) as xs:integer {
let $mid := count($inputs) div 2
return if (count($inputs) eq 1) then $inputs[1] else
tst:multiply($inputs[position() <= $mid]) *
tst:multiply($inputs[position() > $mid])
};
let $inputs := tokenize(normalize-space(/factorials),' ')
let $outputs := for $i in $inputs return xs:string(tst:factorial(xs:integer($i)))return string-join($outputs, '
')
on this input:
<factorials> 10 20 30 40 50 60 600 1000
</factorials>Both Saxon and XQilla return the answer below, but BaseX says:
Stopped at /Users/jorgew/factorial/factorials.xq, 14/74: [FOAR0002] Value out of range: 859541760 * 235989936000.
when I run via the cli like this : basex -X -i factorial.xml factorials.xq
Thoughts?
Thanks,
-jOrGe W.
Response from Saxon, XQilla :
3628800 2432902008176640000 265252859812191058636308480000000 815915283247897734345611269596115894272000000000 30414093201713378043612608166064768844377641568960512000000000000 8320987112741390144276341183223364380754172606361245952449277696409600000000000000 12655723162254307425418678245150829297671403862274660768187828858528140823147351237817802795619571074765208532598060224803240903782164769430795025578054271906283387643826088448124626488332623608376164081221171179439885840257818732919037889603719186743943363062139593784473922231852782547619771723889252476871186000174697934549112845662596182308280390615184691924446215552586523740084932807259056238962104689731522587564412231618018774350801526839567367444928206231310973619440354723718012867753019556135721376207959558860559933052856914157120622980057169891912595926540427596853441276985006724869558201930657900240943007657817473684008944448183219124163017666607770667585082169598239230274035517738648065600492702095732843492708856036920219883363111527988109277392696562776813446645651238419301586157342867860646666350050113314787911320639668510871569846664873595017518995670958477806411667505346462590471136862647349666243426242677175204732314281064417939041868653741187423064985189556742640111598580035644021835576715752869397465453828584471291269955890393294448315746500268702149708808053100406398480942695623586049403348084970064668900206251516968479727515576425962392136269169089884609794271331061018895634421094082310408889752954265842691732460538911784960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Hi Jorge,
The XQuery spec allows implementations to limit the range of integers. We have set this limit to 2^64, as it turns out to be sufficient in most cases. You can use xs:decimal to do computations with greater numbers.
Hope this helps Christian
Quoted text · Jorge Williams · 84 lines
Am 26.07.2016 07:52 schrieb "Jorge Williams" <jorge.williams at rackspace.com>: > Hello all, > > > Performing this query... > > > *xquery version *"1.0"; > > *declare namespace **tst*="http://test.racspace.com"; > > *declare function **tst:factorial* (*$input* *as **xs:integer*) *as * > *xs:integer* { > *let **$result* := *tst:multiply*(1 *to **$input*) > *return **$result* > }; > > *declare function **tst:multiply* (*$inputs* *as **xs:integer**) *as * > *xs:integer* { > *let **$mid* := *count*(*$inputs*) div 2 > *return if* (*count*(*$inputs*) eq 1) *then **$inputs*[1] *else* > *tst:multiply*(*$inputs*[*position*() <= > *$mid*]) * > *tst:multiply*(*$inputs*[*position*() > > *$mid*]) > }; > > *let **$inputs* := *tokenize*(*normalize-space*(/*factorials*),' ') > *let* *$outputs* := *for **$i* *in **$inputs* *return **xs:string*( > *tst:factorial*(*xs:integer*(*$i*))) > > *return **string-join*(*$outputs*, '
') > > > on this input: > > > <factorials> > 10 20 > 30 40 > 50 60 > 600 > 1000 > > </factorials> > > > Both Saxon and XQilla return the answer below, but BaseX says: > > > Stopped at /Users/jorgew/factorial/factorials.xq, 14/74: > [FOAR0002] Value out of range: 859541760 * 235989936000. > > when I run via the cli like this : basex -X -i factorial.xml factorials.xq > > > Thoughts? > > > Thanks, > > > -jOrGe W. > > > Response from Saxon, XQilla : > > > 3628800 > 2432902008176640000 > 265252859812191058636308480000000 > 815915283247897734345611269596115894272000000000 > 30414093201713378043612608166064768844377641568960512000000000000 > > 8320987112741390144276341183223364380754172606361245952449277696409600000000000000 > > 12655723162254307425418678245150829297671403862274660768187828858528140823147351237817802795619571074765208532598060224803240903782164769430795025578054271906283387643826088448124626488332623608376164081221171179439885840257818732919037889603719186743943363062139593784473922231852782547619771723889252476871186000174697934549112845662596182308280390615184691924446215552586523740084932807259056238962104689731522587564412231618018774350801526839567367444928206231310973619440354723718012867753019556135721376207959558860559933052856914157120622980057169891912595926540427596853441276985006724869558201930657900240943007657817473684008944448183219124163017666607770667585082169598239230274035517738648065600492702095732843492708856036920219883363111527988109277392696562776813446645651238419301586157342867860646666350050113314787911320639668510871569846664873595017518995670958477806411667505346462590471136862647349666243426242677175204732314281064417939041868653741187423064985189556742640111598580035644021835576715752869397465453828584471291269955890393294448315746500268702149708808053100406398480942695623586049403348084970064668900206251516968479727515576425962392136269169089884609794271331061018895634421094082310408889752954265842691732460538911784960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > > 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > > > > >
Thanks Christian,
xs:decimal works! A couple of questions
1. Is xs:decimal guaranteed to work across implementations according to the spec, or can that also be limited by a range?
2. Is there a way to programmatically detect the range of xs:integer?
Thanks,
-jOrGe W.
Quoted text · Christian Grün · 51 lines
From: Christian Grün <christian.gruen at gmail.com> Sent: Tuesday, July 26, 2016 1:41 AM To: Jorge Williams Cc: BaseX Subject: Re: [basex-talk] Value out of range on xs:integer? Hi Jorge, The XQuery spec allows implementations to limit the range of integers. We have set this limit to 2^64, as it turns out to be sufficient in most cases. You can use xs:decimal to do computations with greater numbers. Hope this helps Christian Am 26.07.2016 07:52 schrieb "Jorge Williams" <jorge.williams at rackspace.com<mailto:jorge.williams at rackspace.com>>: Hello all, Performing this query... xquery version "1.0"; declare namespace tst="http://test.racspace.com"; declare function tst:factorial ($input as xs:integer) as xs:integer { let $result := tst:multiply(1 to $input) return $result }; declare function tst:multiply ($inputs as xs:integer*) as xs:integer { let $mid := count($inputs) div 2 return if (count($inputs) eq 1) then $inputs[1] else tst:multiply($inputs[position() <= $mid]) * tst:multiply($inputs[position() > $mid]) }; let $inputs := tokenize(normalize-space(/factorials),' ') let $outputs := for $i in $inputs return xs:string(tst:factorial(xs:integer($i))) return string-join($outputs, '
') on this input: <factorials> 10 20 30 40 50 60 600 1000 </factorials> Both Saxon and XQilla return the answer below, but BaseX says: Stopped at /Users/jorgew/factorial/factorials.xq, 14/74: [FOAR0002] Value out of range: 859541760 * 235989936000. when I run via the cli like this : basex -X -i factorial.xml factorials.xq Thoughts? Thanks, -jOrGe W. Response from Saxon, XQilla : 3628800 2432902008176640000 265252859812191058636308480000000 815915283247897734345611269596115894272000000000 30414093201713378043612608166064768844377641568960512000000000000 8320987112741390144276341183223364380754172606361245952449277696409600000000000000 12655723162254307425418678245150829297671403862274660768187828858528140823147351237817802795619571074765208532598060224803240903782164769430795025578054271906283387643826088448124626488332623608376164081221171179439885840257818732919037889603719186743943363062139593784473922231852782547619771723889252476871186000174697934549112845662596182308280390615184691924446215552586523740084932807259056238962104689731522587564412231618018774350801526839567367444928206231310973619440354723718012867753019556135721376207959558860559933052856914157120622980057169891912595926540427596853441276985006724869558201930657900240943007657817473684008944448183219124163017666607770667585082169598239230274035517738648065600492702095732843492708856036920219883363111527988109277392696562776813446645651238419301586157342867860646666350050113314787911320639668510871569846664873595017518995670958477806411667505346462590471136862647349666243426242677175204732314281064417939041868653741187423064985189556742640111598580035644021835576715752869397465453828584471291269955890393294448315746500268702149708808053100406398480942695623586049403348084970064668900206251516968479727515576425962392136269169089884609794271331061018895634421094082310408889752954265842691732460538911784960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Hi Jorge,
Quoted text · Jorge Williams · 2 lines
> 1. Is xs:decimal guaranteed to work across implementations according to the > spec, or can that also be limited by a range?
For details, I recommend you to have a direct look into the relevant specifications (e.g. [1]). Talking about the existing implementations (eXist, Saxon, Zorba, XQilla, etc.), afaik, they all provide a larger range for values of type xs:decimal.
Quoted text · Jorge Williams · 1 line
> 2. Is there a way to programmatically detect the range of xs:integer?
Not really. You’ll have to do arithmetics that exceed the usual limits for integer, long or double values, and check if errors like FOAR0002 are raised.
Hope this helps Christian
Written for BaseX 8.5. BaseX may have changed since: please check the current documentation.