Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Erreur dans un porgramme !

/* $Id: main.c 170 2008-01-22 23:30:18Z endymion $ */

/* À compiler avec "gcc -Wall -pedantic -lm main.c -o main" */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main(void)
{
  int n=1,N;
  float c,a=1;
  scanf("%d",&N);
    while(n<N)
      {
	if((c=sqrt(2*a*a+2*a+1))==floor(c))
	  {
	    n++;
	  }
	a++;
      }
  printf("%.0f %.0f %.0f\n",a-1,a,c);
  return 0;
}

me permet de trouver le n-ième Triangle Rectangle Presque Isocèle. Néanmoins, pour le 7ème, dc m'indique que les valeurs trouvées ne sont pas bonnes :
endymion@hyperion:~/Maths/Programmes/C/TRPI$ ./main
 7
 6437 6438 9104
 endymion@hyperion:~/Maths/Programmes/C/TRPI$ echo "6437 2 ^ p 6438 2 ^ p + p 9104 2 ^ p" | dc
 41434969
 41447844
 82882813
 82882816

Si quelqu'un peut me fournir une explication à ce phénomène !

C'est en forgeant qu'on devient forgeron, et c'est en sciant que Léonard De Vinci !

Mon site perso

Poste le Wednesday 23 January 2008 18:13:18
Répondre     Citer    
Re: Erreur dans un programme !
Envoyé par: nicola

Peut-être que tes valeurs sont trop grandes pour le C, vérifie les limites des entiers que tu utilises.
Essaie d'appeler une bibliothèque un peu plus mathématique, par exemple une spécialisée dans le calcul entier.
Et au lieu de calculer une racine carrée, compare plutôt des carrés, tu pourras tout faire en arithmétique entière.
Au pire, essaie de coder ça en bc, ça sera peut-être plus précis mais moins rapide.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Wednesday 23 January 2008 21:11:32
Répondre     Citer    
Re: Erreur dans un programme !

Je vais essayer d'utiliser des long au lieu des int, voir si y'a du neuf.
C'est vrai que de comparer les carrés est mieux !

En revanche, aurais tu une piste à me donner sur l'utilisation bc ?

C'est en forgeant qu'on devient forgeron, et c'est en sciant que Léonard De Vinci !

Mon site perso

Poste le Wednesday 23 January 2008 21:19:52
Répondre     Citer    
Re: Erreur dans un programme !

En fait, le problème est de trouver un moyen de tester si c est un entier !

C'est en forgeant qu'on devient forgeron, et c'est en sciant que Léonard De Vinci !

Mon site perso

Poste le Wednesday 23 January 2008 21:36:22
Répondre     Citer    
Re: Erreur dans un programme !
Envoyé par: oudoubah

Citation
Vincent-Xavier JUMEL
En fait, le problème est de trouver un moyen de
tester si c est un entier !

Selon la taille de tes nombres, tu peux essayer de voir si c == (long long int)c
Peut être même (unsigned long long), ce qui donnerait une valeur max de 18,446,744,073,709,551,615 (codage sur 64bits)

Même si tu utilises un double, tu ne peux pas être sûr à 100% que la valeur est bien entière (pour voir le codage [en.wikipedia.org])

Si il est impératif de ne travailler qu'avec des entiers, sans arrondi, alors il ne faut utiliser que des entiers.

Pour résoudre ton problème, je pense qu'il vaut mieux, comme le disais Nicola, comparer c[^]2[/^] à floor[^]2[/^], et travailler avec des long long.

Dernier detail, les long long ne sont pas ansi, mais une spécificité gcc (parmis d'autres il me semble).

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 24 January 2008 12:33:51
Répondre     Citer    
Re: Erreur dans un programme !
Envoyé par: nicola

Tape bc -ql dans la console, ou man bc.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Thursday 24 January 2008 13:10:43
Répondre     Citer    
Re: Erreur dans un programme !

En fait, j'ai contourné le problème en disant que sqrt(a)=floor(l) <=> il existe c telque c^2 = l
<code> while(n<N)
{
/* finding c | sqrt(c)==floor(c) <=> \exists l | l*l = c */
while( c*c <= (2*a*a+2*a+1) )
{
if( c*c == (2*a*a+2*a+1) )
{
n++;
}
c++;
}
a++;
}
</code>

C'est en forgeant qu'on devient forgeron, et c'est en sciant que Léonard De Vinci !

Mon site perso

Poste le Thursday 24 January 2008 13:23:23
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Erreur dans un porgramme !
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons