kaliveda-dev team mailing list archive
-
kaliveda-dev team
-
Mailing list archive
-
Message #01226
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.