2011-07-12 1 views
3

Je cherche un moyen de pouvoir traduire entre simple précision et double précision. Un exemple serait de diviser 2 entiers et obtenir un résultat flottant. Comment est-ce possible?Comment diviser deux entiers et obtenir un résultat en float en Forth?

+2

Quel type de quatrième utilisez-vous? – sheepez

+0

ans (je ne suis pas vraiment sûr si cela répond à votre question, mais il est censé être le plus standard: ANS) –

+0

Ok, je demandais parce que pour autant que je sache, le support de virgule flottante est une partie facultative de la standard et vous ne l'avez peut-être pas dans certaines implémentations. – sheepez

Répondre

7

NB. La réponse de rvm repose sur une pile à virgule flottante séparée, qui - bien que non garantie par la norme - est extrêmement commune. Sur kForth, un système avec une pile à virgule flottante unifié et flotteurs à deux cellules, vous pourriez écrire

: s>f s>d d>f ; 
: r/ (n n -- r) \ 'r' for floating-point; 'f' for flags, true/false. 
    swap s>f rot s>f f/ ; 

, qui est toujours pas la norme: elle repose sur les connaissances sur la façon dont grand nombre de PF sont sur la pile. Voici deux méthodes portables:

: r/ (n1 n2 -- r) 
    locals| n2 n1 | 
    n1 s>f n2 s>f f/ ; 

: r/ (n1 n2 -- r) 
    >r s>f r> s>f f/ ; 

Bien que votre meilleure option soit de simplement déclarer la dépendance environnementale et de continuer votre chemin. Une pile flottante séparée aide vraiment, à peu près tout fait comme ça, et un bref prélude peut implémenter une pile FP dans un logiciel si jamais vous voulez porter votre code sur l'un des très rares systèmes qui vous présente un FP unifié empiler. Tout cela mis à part, voici une deuxième réponse à votre question: vous n'avez pas besoin de nombres à virgule flottante pour traiter des valeurs fractionnaires (et dans certains cas, comme l'argent, non seulement vous n'en avez pas besoin mais ne les veux pas). Forth vous permet d'utiliser des nombres à précision fixe avec des opérateurs de mise à l'échelle et des sorties numériques personnalisées.

Un exemple de sortie numérique personnalisée:

: .$ ($ --) 
    s>d <# # # [char] . hold #s [char] $ hold #> type ; 

100 .$ \ outputs: $1.00 
1525 .$ \ outputs: $15.25 

Un exemple de division à l'échelle:

\ what's 14 divided by three, with four fractional digits of precision? 

14 1000 3 */ \ result: 4666 -- use a word like .$ to display it as 4.666 

(Notez que n1 n2 n3 */ est plus précis que n1 n2 * n3 / - lire la spécification.)

: cents (n -- $) ; 
: dollars (n -- $) 100 * ; 
: $ ("$" -- $) 
    parse-word evaluate d>s ; 

\ what's 14 dollars divided by 3? 
14 dollars 3/.$ \ outputs: $4.66 

\ what's 42.35 dollars divided by 2? 

$ 42.35 2/.$ \ outputs: $21.17 (note the loss of a penny!) 

Deux notes à propos de ce mot $. Tout d'abord, il a une dépendance environnementale sur le système acceptant comme un double un nombre avec un. n'importe où, plutôt que juste à la fin. Deuxièmement, il accepte les chiffres avec a. dans eux, même à la fin, mais les chiffres sont toujours interprétés pour avoir deux chiffres fractionnaires - par exemple, $ 4235. est interprété comme 42 dollars et 35 cents, et non quatre mille deux cent trente-cinq dollars. Donc, il est bâclé, mais vous pouvez écrire un mot d'analyse qui est à la fois plus stricte et plus portable.

Vous pourriez dire, "cela ressemble à du travail supplémentaire, les nombres à virgule flottante n'exigent pas autant de discipline de programmeur." Eh bien, avant de vous laisser cette impression fossiliser, lire What Every Computer Science Must Know About Floating-Point Arithmetic :-)

(A la question de sheepez, il n'y a pas le système à distance graves ANS Forth qui ne dispose pas de nombre à virgule flottante de soutien. Vous devrez peut-être charger les installations de PF, mais ils seront là - et 'loadable' ne signifie pas 'tacked on' ou 'moins efficace' Consultez les documents de votre système Forth.)

+0

connaissez-vous un bon compilateur Mac OS X quatrième (quelque chose de banal, rien d'extraordinaire!) –

+1

@ Marci-man [Mops] (http://sourceforge.net/apps/mediawiki/powermops/index.php?title=Main_Page) est un OSX Forth natif, mais est un peu vicié. SwiftForth, VFX Forth, iForth tout fonctionne bien sur OSX. gforth fonctionnera sur OSX comme sur n'importe quel unix, et ne sera pas fantaisie, mais reste très confortable. Si j'étais moi-même, j'irais avec SwiftForth (comme je vais bientôt mettre à jour ma version), mais si j'étais vous, je considérerais fortement gforth (free) ou iForth (130 ou USD), et si Je n'étais pas moi mais encore quelqu'un déjà à l'aise avec Forth, je envisagerais d'obtenir Mops et en supprimant sa distinction Enter/Enter. –

+0

Excellente réponse secondaire. Oui, essayez de ne pas utiliser de flotteurs du tout. – AshleyF