Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : calcul sur des entiers renvoyant un réel [ Divers / Aide et documentation ] (zwyx)

mardi 29 janvier 2008 à 11:53:16 | calcul sur des entiers renvoyant un réel

zwyx

Bonjour à tous,

J'ai constaté une erreur lors de l'exécution de mon programme. Cette erreur vient soit de moi, si j'ai oublié un détail, dans ce cas, vous pourrez m'éclaircir, soit du compilateur de Delphi 6 avec lequel je travaille.

J'ai deux entiers, de valeurs assez grande (par exemple 908652 et 19998), et selon les types desquels il sont déclarés, le calcul de leur variance peut être négatif. Je précise que je fais le calcul de la variance manuellement, en appliquant var(a,b)=(a*a+b*b-a*b)*2/9, et rappelle pour ceux qui auraient oublié leurs lointains cours de math qu'une variance ne peut par définition pas être négative.

<span style="color:#0000FF">function</span> CalculeLaVariance1(A: Cardinal; B: Cardinal): Comp;
<br /><span style="color:#0000FF">begin</span>
<br /> Result := (A*A + B*B - A*B)*2/9;
<br /><span style="color:#0000FF">end</span>;
<br />
<br /><span style="color:#0000FF">function</span> CalculeLaVariance2(A: Int64; B: Cardinal): Comp;
<br /><span style="color:#0000FF">begin</span>
<br /> Result := (A*A + B*B - A*B)*2/9;
<br /><span style="color:#0000FF">end</span>;<br />
<!-- Code colorisé via http://tools.codes-sources.com/colorizeCode.aspx -->

CalculeLaVariance1(908652, 19998) me renvoie -3723681536. Alors que CalculeLaVariance2(908652, 19998) me renvoie 1.7952825344e+11, ce qui est la bonne valeur.

J'espère ne pas être le seul chez qui cette erreur se produit. En attendant vos avis, bonne journée


mardi 29 janvier 2008 à 11:57:03 | Re : calcul sur des entiers renvoyant un réel

zwyx

désolé pour le code qui est copié en html, je le recopie lisiblement:


function CalculeLaVariance1(A: Cardinal; B: Cardinal): Comp;
begin
  Result := (A*A + B*B - A*B)*2/9;
end;


function CalculeLaVariance2(A: Int64; B: Cardinal): Comp;
begin
  Result := (A*A + B*B - A*B)*2/9;
end;


mardi 29 janvier 2008 à 12:15:52 | Re : calcul sur des entiers renvoyant un réel

fbalien

Membre Club
Réponse acceptée !
dans variance1 en mettant un point d'arret et en regardant la valeur de a*a on obtient ceci
E2099 Débordement dans opération de conversion ou arithmétique
Le compilateur a détecté un dépassement dans une expression arithmétique : le résultat de l'expression est trop grand pour être représenté en 32 bits. Vérifiez vos calculs pour vous assurer que la valeur peut être représentée par le matériel.

Alors que dans Variance2 le calcul ce fait sur 64Bit

mardi 29 janvier 2008 à 13:38:33 | Re : calcul sur des entiers renvoyant un réel

zwyx

Merci pour ta réponse.

Y aurait-il un moyen de déclarer quand même A et B en Cardinal, et de préciser que les calculs intermédiaires se fassent en Int64. Puisque du moment que le résultat peut être stocké dans le type de Result, ici Comp, le reste du calcul devrait être transparent.

Peut-être que quelque chose dans ce goût la ferait l'affaire:

function CalculeLaVariance3(A: Cardinal; B: Cardinal): Comp;
begin
  Result := (Int64(A)*Int64(A) + Int64(B)*Int64(B) - Int64(A)*Int64(B))*2/9;
end;


mardi 29 janvier 2008 à 23:31:50 | Re : calcul sur des entiers renvoyant un réel

f0xi

Membre Club Administrateur CodeS-SourceS

const
  CVrc_DDN = 2/9;
  CVrc_max64 = high(int64);

function CVrc(const A, B: LongWord): extended; overload;
begin
  Result := (A*A + B*B - A*B) * CVrc_DDN;
end;

function CVrc(const A, B: Int64): extended; overload;
begin
  result
:= 0;
  if
(A > CVrc_max64) or (B > CVrc_max64) then
    exit;
  Result := (A*A + B*B - A*B) * CVrc_DDN;
end;



le type Comp ne doit pas etre utilisé, il faut preferer le type Int64, comp n'est pas un flottant, c'est un entier non scalaire contrairement aux autres types entiers (tous scalaires), c'est donc un entiers se comportant comme un flottant mais n'est pas un flottant pour autant.

on peu utiliser le type Extended en retour de fonction puisqu'il offre une trés grande pecision comparé aux autre types flottants. ou encore le type Double.

A et B, peuvent etre declaré en LongWord, Cardinal ou DWORD (unsigned int 32bit)
si il en faut plus ont peut les mettre en type Int64 avec comme limite
high(int64) ( 0x7FFFFFFFFFFFFFFF ) pour ne pas accepter les nombres negatif.







deefsign.gif

mercredi 30 janvier 2008 à 09:25:11 | Re : calcul sur des entiers renvoyant un réel

zwyx

Merci pour toutes ce infos f0xi.

J'ai une dernière question, tellement bête que j'ose à peine la poser.
J'ai besoin d'utiliser, ou de définir, un type flottant, signé, avec une grande étendue, (de -1E10 à 1E10 par exemple). Comme personnellement, je connais comme types réels :

   Type                               Étendue
Real48                       2.9 x 10^-39 .. 1.7 x 10^38
Single                       1.5 x 10^-45 .. 3.4 x 10^38
Double                     5.0 x 10^-324 .. 1.7 x 10^308
Real                       5.0 x 10^-324 .. 1.7 x 10^308
Extended                 3.6 x 10^-4951 .. 1.1 x 10^4932
Comp                                  -2^63+1 .. 2^63 -1
Currency    -922337203685477.5808.. 922337203685477.5807

Si le type Comp est à proscrire, car entier non scalaire, il ne reste bien que le type Currency pour satisfaire mes exigences ?




Cette discussion est classé dans : entiers, erreur, calcul, variance, cardinal


Répondre à ce message

Sujets en rapport avec ce message

pb de calcul ... [ par etrix ] salut !voila j'ai mon calcul:with Form1 doC2.Caption:= InttoStr(strToInt(E1.Caption) / strToInt(K2.Caption) - strToInt(k1.Caption) * strToInt(100);ne pb de calcul ... [ par etrix ] salut !voila j'ai mon calcul:with Form1 doC2.Caption:= InttoStr(strToInt(E1.Caption) / strToInt(K2.Caption) - strToInt(k1.Caption) * strToInt(100);ne Calcul de date [ par seawolf ] Je voudrais savoir pourquoi quand je soustrait 2 dates il me retourne une date au lieu de me retourner un entier qui correspond au nombre de jours ent erreur de point d'entrée ??? [ par rindra ] voila je ne sais pas comment faire pour remédier a cet erreurle point d'entrée DdEntry18 est introuvable dans la bibliotheque dynamique ddraw.dllj'uti [ADO] Erreur lors du rafraichissement [ par JeromeTls ] Salut,J'arrive sur ce forum, j'espère que quelqu'un pourra m'aider.J'ai donc un problème de rafraichissement de la base de données avec les messages s Tri extensions de fichiers et PB savedial. [ par MickymX1 ] Kikoo tout le monde..J'ai fureter à travers le forum mais j'ai pas trouver de réponse alors me voilou:1- j'ai une liste de chemin source et de destina Pb avec BDE - URGENT - SOS ! [ par MTBase ] Bonjour,Tout d'abord, je me présente : je suis, parmi 37 autres casquettes (aumoins), resp. info (quel titre !) d'une PME qui a un souci ..je précise au webmaster ... [ par sisi231 ] SISI231Monsieur le webmaster : je mets ici ma question ne trouvant pas d'autres endroits pour la poser :Voulant répondre à un message qui m'était adre [Erreur] RLINK32: Error opening file "C:\Windows\Bureau\NKZ\Programmation\Delphi\Projets\Poker\Unit1.dfm" [ par MasterNKZ ] Salut tout le monde, je refais un ptit poker mais ca coince deja.Voila mon probleme, lorsque j'utilise le composant ImageList et ke je mets plus de 13 a l'aide!! pour la comprehension d'un message [ par jane20002 ] bonjour,une application qui utilise le moteur BDE fonctionne sur certain ordi avec Windows XP Pro comme OS et pas sur d'autres ordis , l'application d


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.