← Back to team overview

kaliveda-dev team mailing list archive

Re: [Question #236920]: Error when compiling KaliVeda 1.8.10 : integer constant is too large for ‘long’ type

 

Question #236920 on KaliVeda changed:
https://answers.launchpad.net/kaliveda/+question/236920

    Status: Open => Answered

John Frankland proposed the following answer:
oui c'est bien 32 bits, mais les variables Double_t et Long64_t de ROOT sont toujours 64-bits,
cet exemple montre bien pourquoi il vaut mieux utiliser les variables redéfinies par ROOT
(en termes de portabilité).
mon problème, c'est que je n'ai plus accès à des machines 32-bit pour tester
(depuis que tout est passé en 64-bit au centre de calcul, il y a quelques années)

est-ce que tu peux remplacer la méthode dans KVBase.cpp par cette nouvelle version
et me dire si ça compile? il y a une infame rustine pour obtenir la valeur '0x8000000000000000'
même si l'architecture machine ne permet pas de l'écrire comme un constant numérique
(il y a probablement un truc pour le faire, mais je connais pas)

Bool_t KVBase::AreEqual(Double_t A, Double_t B, Long64_t maxdif)
{
   // Comparison between two 64-bit floating-point values
   // Returns kTRUE if the integer representations of the two values are within
   // maxdif of each other.
   // By default maxdif=1, which means that we consider that x==y if the
   // difference between them is no greater than the precision of Double_t
   // variables, i.e. 4.94065645841246544e-324
   //
   // Based on the function AlmostEqual2sComplement(float, float, int)
   // by Bruce Dawson http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

   union converter {
      Double_t f;
      Long64_t i;
   } zero, val1, val2;
   
   assert( maxdif > 0 );
   
   if (A == B) return true;
   
   /* rustine to obtain the (64-bit) constant value 0x8000000000000000
      even on 32-bit machines (there is probably an easier way!)      */
   zero.i = 1;
   zero.f = -zero.f;
   zero.i -= 1;
   
   val1.f = A;
   val2.f = B;
   Long64_t Aint, Bint;
   Aint = val1.i;
   Bint = val2.i;
   if(Aint < 0) Aint = zero.i - Aint;
   if(Bint < 0) Bint = zero.i - Bint;
   
   Long64_t intDiff = abs(val1.i - val2.i);

    if (intDiff <= maxdif) return true;

    return false;
}

-- 
You received this question notification because you are a member of
KaliVeda Development Team, which is an answer contact for KaliVeda.