Page 1 of 2

Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:16
by marseille
Pour commencer, supposons que je veuille générer la liste des sécantes des angles entre 80 et 100 degrés, par incrément de 5 degrés. Je supposerai ici que la TI Nspire est configurée en radians, ce qu'elle est par défaut.

J'écrirai donc une ligne telle que celle-ci :
Code: Select all
a:=seq(sec(x°),x,80,100,5)


Ce qui me donnera quand j'exécuterai cette ligne le résultat suivant :
Code: Select all
{((1)/(sin(((π)/(18))))),((1)/(sin(((π)/(36))))),undef,((−1)/(sin(((π)/(36))))),((−1)/(sin(((π)/(18)))))}


ou, pour ceux qui n'ont pas le CAS :
Code: Select all
{5.758770,11.473713,undef,−11.473713,−5.758770}


Imaginons maintenant que je veuille créer un programme qui traite les nombres de cette liste d'une façon quelconque, au moyen d'une boucle for. Je vais donc faire incrémenter une variable i entre 1 et 5, et j'obtiendrai le nombre en cours de traitement dans la boucle par a[i]. Le problème, c'est que, planté au beau milieu de cette liste, il y a un magnifique "undef" qui va donner des résultats bizarres quand ma boucle traitera a[3], ce qui est parfaitement normal, puisque la sécante de 90 degrés n'existe pas. Il faut donc que dans ma boucle, j'intercepte le "undef" quand il va se présenter, au moyen d'une instruction if... then, pour afficher un message d'erreur, ou faire un traitement spécial de ce cas, par exemple. L'idéal serait donc de disposer d'une fonction isUndef, mais hélas, Texas Instruments n'a rien implémenté de tel dans la Nspire. Je vous propose donc de la fabriquer. J'ai mis un peu de temps à trouver le code adéquat, et j'ai pensé qu'il valait mieux en faire profiter les autres.

Code: Select all
Define isundef(x)=isVoid(ifFn(x=x,x,x,_))


Comment ça marche ? La fonction est basée sur le fait que l'égalité x=x échoue pour undef, c'est-à-dire que cette égalité n'est ni vraie, ni fausse, alors qu'elle est toujours vraie pour tout nombre valide. C'est la fonction ifFn qui sert de discriminant. Si x est un nombre, c'est le premier x (soit la variable elle-même) qui est renvoyé par ifFn. Si x est undef, ifFn renvoie _, l'élément "donnée vide". Ce résultat est réinjecté dans isVoid. Si x est un nombre, isVoid renvoie false et si x est _, isVoid renvoie true. Il ne reste plus qu'à envoyer ce booléen dans un test (if isundef(a[i]) then... dans l'exemple) et le tour est joué ! Nota: Le deuxième x de ifFn ne sera jamais renvoyé, il n'est là que pour respecter la syntaxe de la fonction.

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:18
by Excale
Autre possibilité:
Code: Select all
Define isundef(x)=
Func
string(abs(abs(x)))="abs(undef)"
EndFunc


EDIT: Corrigé avec abs() pour gérer les complexes.

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:24
by marseille
Excale wrote:Autre possibilité:
Code: Select all
Define isundef(x)=
Func
string(abs(x))="undef"
EndFunc


EDIT: Corrigé avec abs() pour gérer les complexes.

Ah oui, effectivement. Ca marche aussi. Je n'avais pas essayé avec undef entre guillemets. Les messages d'erreur sont donc tout bêtement de type chaine de caractères. Bon à savoir.

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:26
by Excale
marseille wrote:Je n'avais pas essayé avec undef entre guillemets. Les messages d'erreur sont donc tout bêtement de type chaine de caractères. Bon à savoir.


C'est string() qui transforme une expression mathématique en chaine de caractères (undef n'est pas une erreur). :)

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:32
by marseille
M'inspirant de ta réponse, j'ai fait (avec b étant undef)
b="undef", la calculatrice renvoie false
b/="undef", elle renvoie true.

C'est encore plus court. Il n'y a même pas de fonction !

(EDIT : enfin bref, elle renvoie le résultat en logique inversée. Il ne faut pas me demander pourquoi)

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:34
by Excale
Sauf que si b=2,
b="undef",renvoie false
b/="undef", renvoie true.
Donc ça ne fait plus la différence.

PS: Si tu ne veux pas utiliser de fonction, il suffit de mettre string(abs(x))="undef".

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:45
by marseille
J'ai fait : f:=seq(string(abs(a[i]))="undef",i,1,dim(a))
Ca renvoie : {false,false,false,false,false}

Le troisième false aurait dû être true. Ca ne marche pas.

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 17:49
by Excale
Effectivement, la nspire s'y prend comme un pied ( |undef| renvoie |undef| alors que |undef+i*undef| renvoie undef).

En attendant que je trouve mieux, enlève le abs().

EDIT:
Code: Select all
Define isundef(x)=
Func
string(abs(abs(x)))="abs(undef)"
EndFunc


Ça devrait être mieux comme ça.

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 22:08
by Bisam
Et pourquoi pas simplement :
Code: Select all
Define Libpub isundef(x)=ifFn(x=undef,false,false,true)

Re: Truc : Comment définir qu'une variable est undef

Unread postPosted: 22 Feb 2013, 22:09
by Levak
Delvar a
gettype(a) == "NONE"