Algorithme qui calcule la racine carré d'un nombre

[Fermé]
Signaler
-
 Ahb -
Salut

J'ai crée cet algorithme en langage C qui calcule la racine carré d'un nombre donné, il arrive a le trouver rapidement, mais le problème est que quand on lui entre un nombre trop grand (>1 000 000), les dernières décimales sont fausses

#include<stdio.h>
#include<stdlib.h>
int main ()
{
float x, y=1, p, N, a;
printf("x = ");
scanf("%f", &x);
if(x>=1)
{
p=1;
while(y*y<=x)
{
while(y*y<=x)
{
a=y;
y=y+p;
if(y==a)
break;
}
if(y==a)
break;
y=a;
p=p/10;
}
}
else
{
p=0.1;
while(y*y>=x)
{
while(y*y>=x)
{
a=y;
y=y-p;
if(y==a)
break;
}
if(y==a)
break;
y=a;
p=p/10;
}
}
printf("y = %f", y);
return 0;
}

Il est ou le problème ?
A voir également:

3 réponses

Messages postés
8554
Date d'inscription
lundi 21 décembre 2015
Statut
Membre
Dernière intervention
21 juillet 2020
610
Bonsoir,

racine en C :

sqrt(Ta_variable);

a +
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Merci

Mais je veux développer ma propre fonction
Vous allez me dire que c'est inutile
Mais ça m'aide a progresser en algorithmique
Messages postés
5589
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
21 septembre 2021
945
Salut Ahb,

Sans avoir analysé ton code, as-tu essayé d'utiliser un type de données ayant une plus grande capacité que float (précision) ?


Dal
Salut
Non, je me limite au float pour l'instant
Messages postés
14296
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
10 août 2017
1 110
"Non, je me limite au float pour l'instant"

Ceci explique cela.

Et ce que tu fais n'a pas d'intérêt pour les fonctions "de base", le processeur le calculera bien plus vite pour toi...
>
Messages postés
14296
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
10 août 2017

Ok
Messages postés
5589
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
21 septembre 2021
945
Tu peux tester la taille de la mantisse, qui détermine la précision, pour ton implémentation de C sur ton système avec les macros définies dans <float.h>.

Au dessus de float, tu as des précisions supérieures avec
double
et probablement avec
long double
.

http://www.cplusplus.com/reference/cfloat/

#include <stdio.h>
#include <float.h>

int main(void)
{
    printf("float mantissa digits: %d\n", FLT_MANT_DIG);
    printf("double mantissa digits: %d\n", DBL_MANT_DIG);
    printf("long double mantissa digits: %d\n", LDBL_MANT_DIG);

    return 0;
}

sur mon système 32 bits avec gcc sous Linux, cela me donne :

float mantissa digits: 24
double mantissa digits: 53
long double mantissa digits: 64

La valeur de epsilon pour ces différents types, à laquelle se réfère fiddy dans son post, est également définie par <float.h>.

Dal
>
Messages postés
5589
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
21 septembre 2021

Merci
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 776
Bonjour,

On évite d'utiliser float. Il vaut mieux systématiquement utiliser double pour les flottants (sauf cas particulier...).

Je n'ai pas lu ton algo, mais ça me paraît bizarre. Deux boucles while avec la même condition... A mon avis, tu peux l'améliorer algorithmiquement parlant.

if(y==a)
On ne compare pas avec l'opérateur égal des flottants. On calcule la différence, et si elle est suffisamment petite (inférieure à epsilon) alors on considère qu'ils sont égaux.

T'as oublié d'afficher un '\n' avant le return 0; final.

Cdlt,
Salut

Merci, ça marche beaucoup mieux finalement

Pour ce qui est de la meme condition dans les 2 noucles, c'est juste une sorte de bricolage pour que ça puisse bien fonctionner
Je vais voir ça