2010-06-04 6 views
2

ce que je reçois lorsque je tente de faire des calculs dans emacs Lisp ...nombre Lisp crissement (en fait, une simple addition)

(+ 2082844800. 1274511600.0) 
=> 1209872752.0 
(+ 2082844800.0 1274511600.0) 
=> 3357356400.0 

Quelqu'un pourrait-il me dire ce qui se passe et ce qui est la différence entre représentant un nombre à virgule flottante avec . et .0 à la fin? Merci

+0

Merci - J'utilisais 23.1 sur OS X que j'ai compilé à partir de binaire, ce qui aurait dû être 64 bits, je pensais. Mais mon «plus-positif-fixnum» est 268435455 et '(+ 0 2082844800.)' => -64638848 ... merci à tous. – hatmatrix

+0

Devinez J'ai été habitué à Fortran/Python et tel où a. était suffisant pour indiquer un nombre à virgule flottante ... – hatmatrix

Répondre

7

Miser sur answer et answer de jamessan Anton, et la lecture du dernier fichier NOUVELLES:

On dirait que vous avez une version de Emacs 32 bits. Emacs a une limite pour les entiers qui est most-positive-fixnum, qui a traditionnellement été 268435455 pour les versions 32 bits. Dans le dernier Emacs (23,2), le NEWS file indique:

** Le lecteur Lisp tours entiers qui sont trop grands/petits dans flotteurs. Pour l'instance , sur les machines où 536870911' is the largest integer, reading 536870912 'donne l'objet à virgule flottante `536870912.0'.

Cette modification concerne uniquement le lecteur Lisp ; Cela n'a aucune incidence sur la façon dont les objets entiers débordent.

Ainsi, 23,1 et plus tôt (sur un 32 bits Emacs), 2082844800. a été lu comme un entier, mais est trop grand, l'amenant à déborder et se transformer en -64638848. L'ajout du suffixe .0 dans 23.1 a forcé le lecteur LISP à traiter le nombre comme un nombre à virgule flottante, ce qui a provoqué l'exécution des maths comme prévu.

Dans Emacs 23.2, le lecteur effectue automatiquement cette conversion d'entier en nombre flottant si le nombre est trop important. Donc, si vous mettez à niveau, vous ne devrez pas vous inquiéter à ce sujet.

2

Essayez

(floatp 2082844800.) 
(floatp 2082844800.0) 
(integerp 2082844800.) 

également

(+ 0 2082844800.) 

espoir qui aide

2

Utiliser Emacs 23.2, je ne vois aucune différence entre les deux expressions. Quelle version utilisez-vous et comment effectuez-vous les calculs?


Cela dépend de ce que la plus grande valeur entière de votre version de Emacs peut représenter. Tout ce qui précède est promu d'un entier à un flottant. Vous pouvez accéder à ces informations via les variables most-positive-fixnum/most-negative-fixnum. Dans mon cas, most-positive-fixnum est 536870911 qui est plus petit que le 2082844800 et explique donc pourquoi les deux expressions étaient les mêmes pour moi.