On Tue, Nov 16, 2004 at 11:49:02AM +0000 Nicholas Clark wrote: > On Tue, Nov 16, 2004 at 07:52:09AM +0100, Tassilo von Parseval wrote: > > Hi, > > > > right now I'm lost a bit in the muddle of the various perl compilation > > flags and the sizes of some C datatypes. The task is simply to get the > > numerical maximum of a list of values. Could someone have a look at the > > following XSUB, especially at the #defines at the beginning? In > > particular, I am not sure about using long doubles when 64bit integers > > are in effect: > > On some platforms, sizeof(long double) is 8, so they can't accurately hold > all the values that a 64 bit integer holds. So if you really want to be > completely portable you're going to need something more complex than this > which deals differently with IVs and NVs if the SV is an IV with a large > value.
Hate! > This will get more complex still if you need it to work pre 5.8, because > in 5.6 and earlier the IvOK flag is set if the IV slot is valid as an > integer, rather than if it's numerically identical to the NV, because NV maths > takes priority. eg: > > > $ ~/Reference/5.6.2/bin/perl5.6.2-32 -MDevel::Peek -e '$a = 3.2; $a & 1; Dump > $a' > SV = PVNV(0x8010a0) at 0x806e6c > REFCNT = 1 > FLAGS = (IOK,NOK,pIOK,pNOK,IsUV) > UV = 3 > NV = 3.2 > PV = 0 Hate++ ! So it looks I will have to drown my little XSUBS in even more #ifs and #defines. At least I am now aware of two more pitfalls that I will have to guard against. Cheers, Tassilo -- $_=q#",}])!JAPH!qq(tsuJ[{@"tnirp}3..0}_$;//::niam/s~=)]3[))_$-3(rellac(=_$({ pam{rekcahbus})(rekcah{lrePbus})(lreP{rehtonabus})!JAPH!qq(rehtona{tsuJbus#; $_=reverse,s+(?<=sub).+q#q!'"qq.\t$&."'!#+sexisexiixesixeseg;y~\n~~dddd;eval