Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'essaye d'écrire le plus simplement possible une fonction d'encadrement d'un nombre réel.

 

Mon problème majeur est que je veux qu'elle fonctionne avec les nombres POSITIF et aussi NEGATIF!

 

pour un nombre réel n je voudrais l'entier strictement supérieur suivant et l'entier inférieur ou égal précédent.

 

exemples d'encadrement:

 

5 > 4.3 >= 4

2 > 1.0 >= 1

1 > 0.5 >= 0

1 > 0.0 >= 0

0 > -0.75 >= -1

0 > -1.0 >= -1 (celui-ci par exemple n'est pas retourné de manière exacte par ma routine)

-1 > -1.25 >= -2

 

J'arrive pas à écrire quelque chose de correct pour les nombres négatifs (enfin pas simplement..., je dois être fatigué)

Un petit coup de pouce? Pour que la lumière fuse ;)

 

Voici par exemple où j'en suis, mais qui ne fonctionne pas si je fourni un entier sous forme de réel en négatif.

 

((lambda ( / )
(setq q_pr (getreal "\n Réel?: "))
(princ
(strcat "\n" (rtos q_pr 2 3)
	" >= "
	(rtos
		(if (< q_pr 0.0)
			(- (float (1+ (abs (fix q_pr)))))
			(float (fix q_pr))
		)
	)
)
)
(princ
(strcat "\n" (rtos q_pr 2 3)
	" < "
	(rtos
		(if (< q_pr 0.0)
			(- (float (abs (fix q_pr))))
			(float (1+ (fix q_pr)))
		)
	)
)
)
(prin1)
))

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Salut,

 

en m'inspirant des routines 'floor' et 'ceil'

 

;; floor
;; Retourne l'entier inférieur ou égal au nombre
(defun floor (d)
 ((lambda (n)
    (if (and (minusp d) (< d n))
      (1- n)
      n
    )
  )
   (fix d)
 )
)

;; ceil
;; Retourne l'entier supérieur ou égal au nombre
(defun ceil (d)
 ((lambda (n)
    (if (or (minusp d) (>= n d))
      n
      (1+ n)
    )
  )
   (fix d)
 )
)

 

Un truc qui devrait te convenir :

 

(defun foo (d)
 ((lambda (n)
    (list
      (if (and (minusp d) (< d n))
 (1- n)
 n
      )
      (if (> n d)
 n
 (1+ n)
      )
    )
  )
   (fix d)
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

 

Un truc qui devrait te convenir :

 

(defun foo (d)
 ((lambda (n)
    (list
      (if (and (minusp d) (< d n))
 (1- n)
 n
      )
      (if (> n d)
 n
 (1+ n)
      )
    )
  )
   (fix d)
 )
)

 

En effet cela répond à mon désir, je vais pouvoir faire mes requêtes d'encadrement intelligentes pour map en lisp.

Merci beaucoup (gile), mais je pensais vraiment à plus basique pour faire cela...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Salut

 

J'y vais aussi de ma petite routine.

(defun foo2 (d)
 (if (> d 0)
   (list (fix d)
  (1+ (fix d))
   )
   (list (1- (fix d))
  (fix d)
   )
 )
)

 

@+

 

Ça ne marche pas avec 0.0 et les nombre entiers négatifs...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je n'avais pas intégré avec des entiers, mais bon, pour le plaisir.

 

(defun foo2 (d)
 (if (or (>= d 0) (= (fix d) d))
   (list (fix d)
         (1+ (fix d))
   )
   (list (1- (fix d))
         (fix d)
   )
 )
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Je n'avais pas intégré avec des entiers, mais bon, pour le plaisir.

 

(defun foo2 (d)
 (if (or (>= d 0) (= (fix d) d))
   (list (fix d)
         (1+ (fix d))
   )
   (list (1- (fix d))
         (fix d)
   )
 )
)

 

@+

 

Ça le fait aussi, maintenant j'ai le choix.

En le voyant écrit, je me dis que j'aurais pus le trouver seul, mais franchement j'ai piétiné...

Merci à vous deux.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonsoir,

 

Ma variante sans or ni and ;-)

(defun foo1 (d) 
((lambda (n) 
  (if (minusp (- d n)) 
   (cons n (1- n)) 
   (cons (1+ n) n) 
  ) 
 ) 
 (fix d) 
) 
)

 

La même présenté différemment

(defun foo2 (d / n) 
 (if (minusp (- d (setq n (fix d)))) 
  (cons n (1- n)) 
  (cons (1+ n) n) 
 ) 
)

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Ben avec tout ça, je vais bien réussir à faire quelque chose. B)

 

J'ai trouvé l'oubli dans mon code, j'ai fait la même erreur que Patrick_35: tester l'égalité de la partie entière avec le nombre pour obtenir les valeurs inclusives voulues.

 

En tout cas très instructif tous ces montages différents d'une fonction en somme basique.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonjour,

 

En tout cas très instructif tous ces montages différents d'une fonction en somme basique.

 

Oui tout à fait Bonuscad car il n’y a que ce matin que je viens de réaliser en réfléchissant sur la troncature des nombres réels que (minusp (- d n)) <=> (> n d), des fois c’est avec des évidences que l’on se complique le plus la vie…

 

Donc:

(defun foo (d)
 ((lambda (n)
    (if (> n d)
      (cons n (1- n))
      (cons (1+ n) n)
    )
  )
   (fix d)
 )
)

 

Encore mieux ! ;)

Maintenant oui ! ;)

 

A+

Apprendre => Prendre => Rendre

Posté(e) (modifié)

Re,

 

Bon dans la foulée et à chaud les fruits de mon extrapolation sur la question des encadrements et leurs relations…

 

 

Entier inférieur ou égal?

;; n?<=d
;; Retourne l'entier inférieur ou égal au nombre
(defun n?<=d (d)
 ((lambda (n) (if (> n d) (1- n) n))
  (fix d)
 )
)
;; ou (defun n?<=d (d) (1- (n?>d d)))

 

 

Entier strictement supérieur?

;; n?>d
;; Retourne l'entier strictement supérieur au nombre
(defun n?>d (d)
 ((lambda (n) (if (> n d) n (1+ n)))
  (fix d)
 )
)
;; ou (defun n?>d (d) (1+ (n?<=d d)))

 

 

Entier strictement inférieur?

;; n?<d
;; Retourne l'entier strictement inférieur au nombre
(defun n?<d (d)
 ((lambda (n) (if (<= d n) (1- n) n))
  (fix d)
 )
)
;; ou (defun n?<d (d) (1- (n?>=d d)))

 

 

Entier strictement supérieur ou égal?

;; n?>=d
;; Retourne l'entier strictement supérieur ou égal au nombre
(defun n?>=d (d)
 ((lambda (n) (if (<= d n) n (1+ n)))
  (fix d)
 )
)
;; ou (defun n?>=d (d) (1+ (n?<d d)))

 

 

(Ps : En conclusion si on connait n?<=d ou n?>d et n?<d ou n?>=d cela suffit pour définir tous les cas, comme dans les routines floor & ceil de (gile)).

 

A+

 

 

 

EDIT : Simplifié (< 0 (- d n)) par (>= n d) dans les 2 dernières fonctions en comparant avec la fonction ceil de (gile)

Modifié par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

Bonjour,

 

 

 

Oui tout à fait Bonuscad car il n’y a que ce matin que je viens de réaliser en réfléchissant sur la troncature des nombres réels que (minusp (- d n)) <=> (> n d), des fois c’est avec des évidences que l’on se complique le plus la vie…

 

Donc:

(defun foo (d)
 ((lambda (n)
    (if (> n d)
      (cons n (1- n))
      (cons (1+ n) n)
    )
  )
   (fix d)
 )
)

 

 

Maintenant oui ! ;)

 

A+

Comme le dirait Bonus, à le voir écrit, cela saute au yeux

 

En le voyant écrit, je me dis que j'aurais pus le trouver seul, mais franchement j'ai piétiné...

C'est les fêtes qui commencent ;)

 

Quand ça m'arrive, je laisse tomber le code et je le reprends le lendemain. En général, au bout de 5mn, c'est bouclé.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité