Comparer 2 nombres sans faire de test ...

Discutez d'informatique ici !
p-convexe
Membre Naturel
Messages: 26
Enregistré le: 16 Sep 2012, 03:04

Comparer 2 nombres sans faire de test ...

par p-convexe » 16 Sep 2012, 05:54

Bonjour,

Il s'agit d'un petit problème à résoudre sur ordinateur, en utilisant par exemple un bon vieux basic (dont je pense que tout le monde a plus ou moins une idée).

On ne pourra pas utiliser d'instruction réalisant un test, telles :
IF - MAX (x,y) - MIN (x,y) - SUP (x,y) - INF (x,y) - des boucles itératives - etc
(Allez sur le Net vous aurez toutes les fonctions "basiques" du Basic)

Voici le problème :
Soit x une variable réelle et n un nombre réel non nul (ceci pour simplifier).
Déterminer une "fonction" f(x) calculable par l'ordinateur telle que :
Si x < n ;) f(x) = 0
Si x ;) n ;) f(x) = 1
---
Evidemment j'ai des solutions !

p-convexe



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 16 Sep 2012, 08:01

re,

je vois pas l'intérêt d'éviter les fonctions de vba si tu fais du vba. Ya-t-il une raison? (ps: c'est pour les dinosaures ce langage)
Sinon, on reconnait la fonction de heaviside moyennant un offset n mais on en fera rien si on est pas capable de ne serait-ce que calculer une valeur absolue.

ou alors, par fourier :cry:
la vie est une fête :)

p-convexe
Membre Naturel
Messages: 26
Enregistré le: 16 Sep 2012, 03:04

par p-convexe » 16 Sep 2012, 08:52

fatal_error a écrit:re,

je vois pas l'intérêt d'éviter les fonctions de vba si tu fais du vba. Y-a-t-il une raison? (ps: c'est pour les dinosaures ce langage)
Sinon, on reconnait la fonction de heaviside moyennant un offset n mais on en fera rien si on est pas capable de ne serait-ce que calculer une valeur absolue.

ou alors, par fourier :cry:
Bonjour,
Merci pour cette réponse.

Pour les dinosaures : Les calculs en Basic sont immédiats sans préparation.

Heaveside & Fourier : trop compliqué [la (ou les) "fonction(s)" tiennent en quelques termes], par ailleurs très difficile (voire impossible ?) à intégrer dans un programme devant tourner tout seul, de plus "bonjour" l'étude mathématique pour vérifier la validité des programmes les utilisant.

Y-a-t-il une raison : j'ai eu besoin de cette(s) "fonction(s)" pour simplifier la programmation de gros calculs actuariels, pour minimiser le nombre de tests nécessaires pour valider les programmes [classiquement si un programme contient n tests, il faut 2^n tests pour vérifier la validité des algorithmes, l'utilisation de la "fonction" nécessitera qu'un nombre k*n de tests]
Autre propriété : cette "fonction" a toutes les propriétés d'une fonction classique, elle est infiniment dérivable sauf en un nombre de points finis (on évite les discontinuités en ces points en utilisant à nouveau de telles "fonctions").
Inconvénient : elle peut ralentir les programmes.

Cordialement.

p-convexe

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 16 Sep 2012, 09:25

il faut pas confondre l'emploi des utilisations des primitives de VBA avec la suppression des branches (if else).

Il n'y a normalement pas besoin d'effectuer 2^n tests pour vérifier que ta suite de n tests fonctionne correctement.

Un test prend des paramètres d'entrée et de sortie.
Pour chaque test tu dois vérifier que la sortie est conforme au paramètre d'entrée.

En l'occurrence, pour un test à un paramètre d'entrée tu n'as que deux tests à effectuer. (qui semble être une valeur booléenne représentée par ta fonction)

note: heaviside c'est qd même simpliste:
moyennant la syntaxe.
Code: Tout sélectionner
heaviside(x, seuil){
 return x>seuil
}

cela dit ca ne changera strictement rien au problème de tester la valeur de retour qui sera toujours là.

Si ton but est de supprimer la branche
Code: Tout sélectionner
if(x>n){
 test2_1()
}else
{
 test2_2()
}

en
Code: Tout sélectionner
test2(x, heaviside(x, seuil)){

}

tu ne fais que reporter le test sur x au sein de test2, ca ne change rien concernant le nombre de tests à écrire
la vie est une fête :)

p-convexe
Membre Naturel
Messages: 26
Enregistré le: 16 Sep 2012, 03:04

par p-convexe » 16 Sep 2012, 10:29

(Re)Bonjour,
Encore Merci pour la réponse.

Vous allez dire que je "pinaille" mais vous faites un test, ce qui était exclus dans ma question.

Ma 'fonction" retourne une valeur mais à aucun moment ne teste les valeurs x et n entre elles,
c'est seulement la valeur de la "fonction" qui permet de dire si x;)n ou si x<n

En fait lorsque je revois l'expression analytique de cette "fonction" , j'ai toujours du mal à être convaincu que, sans comparer x à n , on puisse classer x par rapport à n
---
Au-delà de la portée dépassée et de l'intérêt anecdotique de cette "fonction" , elle m'a aussi servie (et me sert encore quelquefois) à simplifier des problèmes de logiques

Cordialement.

p-convexe

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 16 Sep 2012, 10:41

Ma 'fonction" retourne une valeur mais à aucun moment ne teste les valeurs x et n entre elles,

En fait lorsque je revois l'expression analytique de cette "fonction" , j'ai toujours du mal à être convaincu que, sans comparer x à n , on puisse classer x par rapport à n

t'es un peu contradictoire.

Par définition ta fonction dit si x>n, alors 1.
Ca me parait évident qu'à un moment ou à un autre, n va intervenir, tout comme x dans l'expression de ta fonction.

Il faudrait que tu sois plus explicite par rapport à ton problème, parce que je peux pas faire plus.

Pour l'instant, heaviside correspond parfaitement à la définition que tu as donné,
f:x-> (x<n)?0:1
la vie est une fête :)

p-convexe
Membre Naturel
Messages: 26
Enregistré le: 16 Sep 2012, 03:04

par p-convexe » 16 Sep 2012, 11:16

(Re)Bonjour,

Effectivement dans ma "fonction" apparait x et n , mais je ne les compare à aucun moment.

J'utilise l'instruction FIX qui tronque un nombre en lui gardant son signe, informatiquement l'écriture du nombre est en 3 parties :
N1 : décimales (derrière la virgule) - N2 : un séparateur (pour la virgule) - N3 : le nombre devant la virgule.
donc l'instruction FIX ordonne à l'ordinateur de retourner le contenu de N3

La voici (mais elle peut avoir d'autres expressions, en particulier ;)pour tout réel n) :
............. f'(x,n) = FIX(FIX(x/n)/(FIX(x/n) - 1/3))

Merci pour la patience dont vous avez fait part pour me répondre
Cordialement.

p-convexe

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 16 Sep 2012, 11:58

slt,

en fait c'est le contraire, tu cherches à écrire ta fonction à l'aide des primitives vba.

On peut utiliser la fonction http://www.techonthenet.com/excel/formulas/sgn.php


If number is greater than zero, the SGN function will return 1.
If number is equal to zero, the SGN function will return 0.
If number is less than zero, the SGN function will return -1.


idem on décale la fonction de N
f(x,n)=SGN(x-n)
donc x-1
x>n ->1
x==n ->0
on veut appliquer g, telle que g(-1)=-1, g(0)=-1 et g(1)=1, il suffit de rappliquer heaviside en mettons 1/2
genre g(x)=SGN(x-1/2)
enfin prendre h(x) telle que h(-1)=0 et h(1)=1. Par exemple une translation de type
h(x) = (x+1)/2
où bien encore une fois heaviside :)
h(x) = sgn(x+1) (qui vaudra 0 si x==-1 ou 1 si x supérieur
cad
ta fonction recherchée peut s'écrire
Code: Tout sélectionner
f(x,n) = (    SGN(  SGN(x-n)-1/2  )+1   )/2
f(x,n) = SGN((SGN (SGN(x-n) -1/2) ) +1)

la vie est une fête :)

p-convexe
Membre Naturel
Messages: 26
Enregistré le: 16 Sep 2012, 03:04

par p-convexe » 16 Sep 2012, 12:44

(Re)Bonjour,

Merci pour ce beau raisonnement.
La 1ère fonction a un problème : il manque une parenthèse ouverte, je n'ai pas cherché à la rectifier.

Merci beaucoup pour le site internet, qui me servira beaucoup.

Cordialement.

p-convexe

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite