/*******************************************************************1** f l o a t . c2** Forth Inspired Command Language3** ANS Forth FLOAT word-set written in C4** Author: Guy Carver & John Sadler ([email protected])5** Created: Apr 20016** $Id: float.c,v 1.8 2001/12/05 07:21:34 jsadler Exp $7*******************************************************************/8/*9** Copyright (c) 1997-2001 John Sadler ([email protected])10** All rights reserved.11**12** Get the latest Ficl release at http://ficl.sourceforge.net13**14** I am interested in hearing from anyone who uses ficl. If you have15** a problem, a success story, a defect, an enhancement request, or16** if you would like to contribute to the ficl release, please17** contact me by email at the address above.18**19** L I C E N S E and D I S C L A I M E R20**21** Redistribution and use in source and binary forms, with or without22** modification, are permitted provided that the following conditions23** are met:24** 1. Redistributions of source code must retain the above copyright25** notice, this list of conditions and the following disclaimer.26** 2. Redistributions in binary form must reproduce the above copyright27** notice, this list of conditions and the following disclaimer in the28** documentation and/or other materials provided with the distribution.29**30** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND31** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE32** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE33** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE34** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL35** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS36** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)37** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT38** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY39** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF40** SUCH DAMAGE.41*/424344#include "ficl.h"4546#if FICL_WANT_FLOAT47#include <stdlib.h>48#include <stdio.h>49#include <string.h>50#include <ctype.h>51#include <math.h>5253/*******************************************************************54** Do float addition r1 + r2.55** f+ ( r1 r2 -- r )56*******************************************************************/57static void Fadd(FICL_VM *pVM)58{59FICL_FLOAT f;6061#if FICL_ROBUST > 162vmCheckFStack(pVM, 2, 1);63#endif6465f = POPFLOAT();66f += GETTOPF().f;67SETTOPF(f);68}6970/*******************************************************************71** Do float subtraction r1 - r2.72** f- ( r1 r2 -- r )73*******************************************************************/74static void Fsub(FICL_VM *pVM)75{76FICL_FLOAT f;7778#if FICL_ROBUST > 179vmCheckFStack(pVM, 2, 1);80#endif8182f = POPFLOAT();83f = GETTOPF().f - f;84SETTOPF(f);85}8687/*******************************************************************88** Do float multiplication r1 * r2.89** f* ( r1 r2 -- r )90*******************************************************************/91static void Fmul(FICL_VM *pVM)92{93FICL_FLOAT f;9495#if FICL_ROBUST > 196vmCheckFStack(pVM, 2, 1);97#endif9899f = POPFLOAT();100f *= GETTOPF().f;101SETTOPF(f);102}103104/*******************************************************************105** Do float negation.106** fnegate ( r -- r )107*******************************************************************/108static void Fnegate(FICL_VM *pVM)109{110FICL_FLOAT f;111112#if FICL_ROBUST > 1113vmCheckFStack(pVM, 1, 1);114#endif115116f = -GETTOPF().f;117SETTOPF(f);118}119120/*******************************************************************121** Do float division r1 / r2.122** f/ ( r1 r2 -- r )123*******************************************************************/124static void Fdiv(FICL_VM *pVM)125{126FICL_FLOAT f;127128#if FICL_ROBUST > 1129vmCheckFStack(pVM, 2, 1);130#endif131132f = POPFLOAT();133f = GETTOPF().f / f;134SETTOPF(f);135}136137/*******************************************************************138** Do float + integer r + n.139** f+i ( r n -- r )140*******************************************************************/141static void Faddi(FICL_VM *pVM)142{143FICL_FLOAT f;144145#if FICL_ROBUST > 1146vmCheckFStack(pVM, 1, 1);147vmCheckStack(pVM, 1, 0);148#endif149150f = (FICL_FLOAT)POPINT();151f += GETTOPF().f;152SETTOPF(f);153}154155/*******************************************************************156** Do float - integer r - n.157** f-i ( r n -- r )158*******************************************************************/159static void Fsubi(FICL_VM *pVM)160{161FICL_FLOAT f;162163#if FICL_ROBUST > 1164vmCheckFStack(pVM, 1, 1);165vmCheckStack(pVM, 1, 0);166#endif167168f = GETTOPF().f;169f -= (FICL_FLOAT)POPINT();170SETTOPF(f);171}172173/*******************************************************************174** Do float * integer r * n.175** f*i ( r n -- r )176*******************************************************************/177static void Fmuli(FICL_VM *pVM)178{179FICL_FLOAT f;180181#if FICL_ROBUST > 1182vmCheckFStack(pVM, 1, 1);183vmCheckStack(pVM, 1, 0);184#endif185186f = (FICL_FLOAT)POPINT();187f *= GETTOPF().f;188SETTOPF(f);189}190191/*******************************************************************192** Do float / integer r / n.193** f/i ( r n -- r )194*******************************************************************/195static void Fdivi(FICL_VM *pVM)196{197FICL_FLOAT f;198199#if FICL_ROBUST > 1200vmCheckFStack(pVM, 1, 1);201vmCheckStack(pVM, 1, 0);202#endif203204f = GETTOPF().f;205f /= (FICL_FLOAT)POPINT();206SETTOPF(f);207}208209/*******************************************************************210** Do integer - float n - r.211** i-f ( n r -- r )212*******************************************************************/213static void isubf(FICL_VM *pVM)214{215FICL_FLOAT f;216217#if FICL_ROBUST > 1218vmCheckFStack(pVM, 1, 1);219vmCheckStack(pVM, 1, 0);220#endif221222f = (FICL_FLOAT)POPINT();223f -= GETTOPF().f;224SETTOPF(f);225}226227/*******************************************************************228** Do integer / float n / r.229** i/f ( n r -- r )230*******************************************************************/231static void idivf(FICL_VM *pVM)232{233FICL_FLOAT f;234235#if FICL_ROBUST > 1236vmCheckFStack(pVM, 1,1);237vmCheckStack(pVM, 1, 0);238#endif239240f = (FICL_FLOAT)POPINT();241f /= GETTOPF().f;242SETTOPF(f);243}244245/*******************************************************************246** Do integer to float conversion.247** int>float ( n -- r )248*******************************************************************/249static void itof(FICL_VM *pVM)250{251float f;252253#if FICL_ROBUST > 1254vmCheckStack(pVM, 1, 0);255vmCheckFStack(pVM, 0, 1);256#endif257258f = (float)POPINT();259PUSHFLOAT(f);260}261262/*******************************************************************263** Do float to integer conversion.264** float>int ( r -- n )265*******************************************************************/266static void Ftoi(FICL_VM *pVM)267{268FICL_INT i;269270#if FICL_ROBUST > 1271vmCheckStack(pVM, 0, 1);272vmCheckFStack(pVM, 1, 0);273#endif274275i = (FICL_INT)POPFLOAT();276PUSHINT(i);277}278279/*******************************************************************280** Floating point constant execution word.281*******************************************************************/282void FconstantParen(FICL_VM *pVM)283{284FICL_WORD *pFW = pVM->runningWord;285286#if FICL_ROBUST > 1287vmCheckFStack(pVM, 0, 1);288#endif289290PUSHFLOAT(pFW->param[0].f);291}292293/*******************************************************************294** Create a floating point constant.295** fconstant ( r -"name"- )296*******************************************************************/297static void Fconstant(FICL_VM *pVM)298{299FICL_DICT *dp = vmGetDict(pVM);300STRINGINFO si = vmGetWord(pVM);301302#if FICL_ROBUST > 1303vmCheckFStack(pVM, 1, 0);304#endif305306dictAppendWord2(dp, si, FconstantParen, FW_DEFAULT);307dictAppendCell(dp, stackPop(pVM->fStack));308}309310/*******************************************************************311** Display a float in decimal format.312** f. ( r -- )313*******************************************************************/314static void FDot(FICL_VM *pVM)315{316float f;317318#if FICL_ROBUST > 1319vmCheckFStack(pVM, 1, 0);320#endif321322f = POPFLOAT();323sprintf(pVM->pad,"%#f ",f);324vmTextOut(pVM, pVM->pad, 0);325}326327/*******************************************************************328** Display a float in engineering format.329** fe. ( r -- )330*******************************************************************/331static void EDot(FICL_VM *pVM)332{333float f;334335#if FICL_ROBUST > 1336vmCheckFStack(pVM, 1, 0);337#endif338339f = POPFLOAT();340sprintf(pVM->pad,"%#e ",f);341vmTextOut(pVM, pVM->pad, 0);342}343344/**************************************************************************345d i s p l a y FS t a c k346** Display the parameter stack (code for "f.s")347** f.s ( -- )348**************************************************************************/349static void displayFStack(FICL_VM *pVM)350{351int d = stackDepth(pVM->fStack);352int i;353CELL *pCell;354355vmCheckFStack(pVM, 0, 0);356357vmTextOut(pVM, "F:", 0);358359if (d == 0)360vmTextOut(pVM, "[0]", 0);361else362{363ltoa(d, &pVM->pad[1], pVM->base);364pVM->pad[0] = '[';365strcat(pVM->pad,"] ");366vmTextOut(pVM,pVM->pad,0);367368pCell = pVM->fStack->sp - d;369for (i = 0; i < d; i++)370{371sprintf(pVM->pad,"%#f ",(*pCell++).f);372vmTextOut(pVM,pVM->pad,0);373}374}375}376377/*******************************************************************378** Do float stack depth.379** fdepth ( -- n )380*******************************************************************/381static void Fdepth(FICL_VM *pVM)382{383int i;384385#if FICL_ROBUST > 1386vmCheckStack(pVM, 0, 1);387#endif388389i = stackDepth(pVM->fStack);390PUSHINT(i);391}392393/*******************************************************************394** Do float stack drop.395** fdrop ( r -- )396*******************************************************************/397static void Fdrop(FICL_VM *pVM)398{399#if FICL_ROBUST > 1400vmCheckFStack(pVM, 1, 0);401#endif402403DROPF(1);404}405406/*******************************************************************407** Do float stack 2drop.408** f2drop ( r r -- )409*******************************************************************/410static void FtwoDrop(FICL_VM *pVM)411{412#if FICL_ROBUST > 1413vmCheckFStack(pVM, 2, 0);414#endif415416DROPF(2);417}418419/*******************************************************************420** Do float stack dup.421** fdup ( r -- r r )422*******************************************************************/423static void Fdup(FICL_VM *pVM)424{425#if FICL_ROBUST > 1426vmCheckFStack(pVM, 1, 2);427#endif428429PICKF(0);430}431432/*******************************************************************433** Do float stack 2dup.434** f2dup ( r1 r2 -- r1 r2 r1 r2 )435*******************************************************************/436static void FtwoDup(FICL_VM *pVM)437{438#if FICL_ROBUST > 1439vmCheckFStack(pVM, 2, 4);440#endif441442PICKF(1);443PICKF(1);444}445446/*******************************************************************447** Do float stack over.448** fover ( r1 r2 -- r1 r2 r1 )449*******************************************************************/450static void Fover(FICL_VM *pVM)451{452#if FICL_ROBUST > 1453vmCheckFStack(pVM, 2, 3);454#endif455456PICKF(1);457}458459/*******************************************************************460** Do float stack 2over.461** f2over ( r1 r2 r3 -- r1 r2 r3 r1 r2 )462*******************************************************************/463static void FtwoOver(FICL_VM *pVM)464{465#if FICL_ROBUST > 1466vmCheckFStack(pVM, 4, 6);467#endif468469PICKF(3);470PICKF(3);471}472473/*******************************************************************474** Do float stack pick.475** fpick ( n -- r )476*******************************************************************/477static void Fpick(FICL_VM *pVM)478{479CELL c = POP();480481#if FICL_ROBUST > 1482vmCheckFStack(pVM, c.i+1, c.i+2);483#endif484485PICKF(c.i);486}487488/*******************************************************************489** Do float stack ?dup.490** f?dup ( r -- r )491*******************************************************************/492static void FquestionDup(FICL_VM *pVM)493{494CELL c;495496#if FICL_ROBUST > 1497vmCheckFStack(pVM, 1, 2);498#endif499500c = GETTOPF();501if (c.f != 0)502PICKF(0);503}504505/*******************************************************************506** Do float stack roll.507** froll ( n -- )508*******************************************************************/509static void Froll(FICL_VM *pVM)510{511int i = POP().i;512i = (i > 0) ? i : 0;513514#if FICL_ROBUST > 1515vmCheckFStack(pVM, i+1, i+1);516#endif517518ROLLF(i);519}520521/*******************************************************************522** Do float stack -roll.523** f-roll ( n -- )524*******************************************************************/525static void FminusRoll(FICL_VM *pVM)526{527int i = POP().i;528i = (i > 0) ? i : 0;529530#if FICL_ROBUST > 1531vmCheckFStack(pVM, i+1, i+1);532#endif533534ROLLF(-i);535}536537/*******************************************************************538** Do float stack rot.539** frot ( r1 r2 r3 -- r2 r3 r1 )540*******************************************************************/541static void Frot(FICL_VM *pVM)542{543#if FICL_ROBUST > 1544vmCheckFStack(pVM, 3, 3);545#endif546547ROLLF(2);548}549550/*******************************************************************551** Do float stack -rot.552** f-rot ( r1 r2 r3 -- r3 r1 r2 )553*******************************************************************/554static void Fminusrot(FICL_VM *pVM)555{556#if FICL_ROBUST > 1557vmCheckFStack(pVM, 3, 3);558#endif559560ROLLF(-2);561}562563/*******************************************************************564** Do float stack swap.565** fswap ( r1 r2 -- r2 r1 )566*******************************************************************/567static void Fswap(FICL_VM *pVM)568{569#if FICL_ROBUST > 1570vmCheckFStack(pVM, 2, 2);571#endif572573ROLLF(1);574}575576/*******************************************************************577** Do float stack 2swap578** f2swap ( r1 r2 r3 r4 -- r3 r4 r1 r2 )579*******************************************************************/580static void FtwoSwap(FICL_VM *pVM)581{582#if FICL_ROBUST > 1583vmCheckFStack(pVM, 4, 4);584#endif585586ROLLF(3);587ROLLF(3);588}589590/*******************************************************************591** Get a floating point number from a variable.592** f@ ( n -- r )593*******************************************************************/594static void Ffetch(FICL_VM *pVM)595{596CELL *pCell;597598#if FICL_ROBUST > 1599vmCheckFStack(pVM, 0, 1);600vmCheckStack(pVM, 1, 0);601#endif602603pCell = (CELL *)POPPTR();604PUSHFLOAT(pCell->f);605}606607/*******************************************************************608** Store a floating point number into a variable.609** f! ( r n -- )610*******************************************************************/611static void Fstore(FICL_VM *pVM)612{613CELL *pCell;614615#if FICL_ROBUST > 1616vmCheckFStack(pVM, 1, 0);617vmCheckStack(pVM, 1, 0);618#endif619620pCell = (CELL *)POPPTR();621pCell->f = POPFLOAT();622}623624/*******************************************************************625** Add a floating point number to contents of a variable.626** f+! ( r n -- )627*******************************************************************/628static void FplusStore(FICL_VM *pVM)629{630CELL *pCell;631632#if FICL_ROBUST > 1633vmCheckStack(pVM, 1, 0);634vmCheckFStack(pVM, 1, 0);635#endif636637pCell = (CELL *)POPPTR();638pCell->f += POPFLOAT();639}640641/*******************************************************************642** Floating point literal execution word.643*******************************************************************/644static void fliteralParen(FICL_VM *pVM)645{646#if FICL_ROBUST > 1647vmCheckStack(pVM, 0, 1);648#endif649650PUSHFLOAT(*(float*)(pVM->ip));651vmBranchRelative(pVM, 1);652}653654/*******************************************************************655** Compile a floating point literal.656*******************************************************************/657static void fliteralIm(FICL_VM *pVM)658{659FICL_DICT *dp = vmGetDict(pVM);660FICL_WORD *pfLitParen = ficlLookup(pVM->pSys, "(fliteral)");661662#if FICL_ROBUST > 1663vmCheckFStack(pVM, 1, 0);664#endif665666dictAppendCell(dp, LVALUEtoCELL(pfLitParen));667dictAppendCell(dp, stackPop(pVM->fStack));668}669670/*******************************************************************671** Do float 0= comparison r = 0.0.672** f0= ( r -- T/F )673*******************************************************************/674static void FzeroEquals(FICL_VM *pVM)675{676CELL c;677678#if FICL_ROBUST > 1679vmCheckFStack(pVM, 1, 0); /* Make sure something on float stack. */680vmCheckStack(pVM, 0, 1); /* Make sure room for result. */681#endif682683c.i = FICL_BOOL(POPFLOAT() == 0);684PUSH(c);685}686687/*******************************************************************688** Do float 0< comparison r < 0.0.689** f0< ( r -- T/F )690*******************************************************************/691static void FzeroLess(FICL_VM *pVM)692{693CELL c;694695#if FICL_ROBUST > 1696vmCheckFStack(pVM, 1, 0); /* Make sure something on float stack. */697vmCheckStack(pVM, 0, 1); /* Make sure room for result. */698#endif699700c.i = FICL_BOOL(POPFLOAT() < 0);701PUSH(c);702}703704/*******************************************************************705** Do float 0> comparison r > 0.0.706** f0> ( r -- T/F )707*******************************************************************/708static void FzeroGreater(FICL_VM *pVM)709{710CELL c;711712#if FICL_ROBUST > 1713vmCheckFStack(pVM, 1, 0);714vmCheckStack(pVM, 0, 1);715#endif716717c.i = FICL_BOOL(POPFLOAT() > 0);718PUSH(c);719}720721/*******************************************************************722** Do float = comparison r1 = r2.723** f= ( r1 r2 -- T/F )724*******************************************************************/725static void FisEqual(FICL_VM *pVM)726{727float x, y;728729#if FICL_ROBUST > 1730vmCheckFStack(pVM, 2, 0);731vmCheckStack(pVM, 0, 1);732#endif733734x = POPFLOAT();735y = POPFLOAT();736PUSHINT(FICL_BOOL(x == y));737}738739/*******************************************************************740** Do float < comparison r1 < r2.741** f< ( r1 r2 -- T/F )742*******************************************************************/743static void FisLess(FICL_VM *pVM)744{745float x, y;746747#if FICL_ROBUST > 1748vmCheckFStack(pVM, 2, 0);749vmCheckStack(pVM, 0, 1);750#endif751752y = POPFLOAT();753x = POPFLOAT();754PUSHINT(FICL_BOOL(x < y));755}756757/*******************************************************************758** Do float > comparison r1 > r2.759** f> ( r1 r2 -- T/F )760*******************************************************************/761static void FisGreater(FICL_VM *pVM)762{763float x, y;764765#if FICL_ROBUST > 1766vmCheckFStack(pVM, 2, 0);767vmCheckStack(pVM, 0, 1);768#endif769770y = POPFLOAT();771x = POPFLOAT();772PUSHINT(FICL_BOOL(x > y));773}774775776/*******************************************************************777** Move float to param stack (assumes they both fit in a single CELL)778** f>s779*******************************************************************/780static void FFrom(FICL_VM *pVM)781{782CELL c;783784#if FICL_ROBUST > 1785vmCheckFStack(pVM, 1, 0);786vmCheckStack(pVM, 0, 1);787#endif788789c = stackPop(pVM->fStack);790stackPush(pVM->pStack, c);791return;792}793794static void ToF(FICL_VM *pVM)795{796CELL c;797798#if FICL_ROBUST > 1799vmCheckFStack(pVM, 0, 1);800vmCheckStack(pVM, 1, 0);801#endif802803c = stackPop(pVM->pStack);804stackPush(pVM->fStack, c);805return;806}807808809/**************************************************************************810F l o a t P a r s e S t a t e811** Enum to determine the current segment of a floating point number812** being parsed.813**************************************************************************/814#define NUMISNEG 1815#define EXPISNEG 2816817typedef enum _floatParseState818{819FPS_START,820FPS_ININT,821FPS_INMANT,822FPS_STARTEXP,823FPS_INEXP824} FloatParseState;825826/**************************************************************************827f i c l P a r s e F l o a t N u m b e r828** pVM -- Virtual Machine pointer.829** si -- String to parse.830** Returns 1 if successful, 0 if not.831**************************************************************************/832int ficlParseFloatNumber( FICL_VM *pVM, STRINGINFO si )833{834unsigned char ch, digit;835char *cp;836FICL_COUNT count;837float power;838float accum = 0.0f;839float mant = 0.1f;840FICL_INT exponent = 0;841char flag = 0;842FloatParseState estate = FPS_START;843844#if FICL_ROBUST > 1845vmCheckFStack(pVM, 0, 1);846#endif847848/*849** floating point numbers only allowed in base 10850*/851if (pVM->base != 10)852return(0);853854855cp = SI_PTR(si);856count = (FICL_COUNT)SI_COUNT(si);857858/* Loop through the string's characters. */859while ((count--) && ((ch = *cp++) != 0))860{861switch (estate)862{863/* At start of the number so look for a sign. */864case FPS_START:865{866estate = FPS_ININT;867if (ch == '-')868{869flag |= NUMISNEG;870break;871}872if (ch == '+')873{874break;875}876} /* Note! Drop through to FPS_ININT */877/*878**Converting integer part of number.879** Only allow digits, decimal and 'E'.880*/881case FPS_ININT:882{883if (ch == '.')884{885estate = FPS_INMANT;886}887else if ((ch == 'e') || (ch == 'E'))888{889estate = FPS_STARTEXP;890}891else892{893digit = (unsigned char)(ch - '0');894if (digit > 9)895return(0);896897accum = accum * 10 + digit;898899}900break;901}902/*903** Processing the fraction part of number.904** Only allow digits and 'E'905*/906case FPS_INMANT:907{908if ((ch == 'e') || (ch == 'E'))909{910estate = FPS_STARTEXP;911}912else913{914digit = (unsigned char)(ch - '0');915if (digit > 9)916return(0);917918accum += digit * mant;919mant *= 0.1f;920}921break;922}923/* Start processing the exponent part of number. */924/* Look for sign. */925case FPS_STARTEXP:926{927estate = FPS_INEXP;928929if (ch == '-')930{931flag |= EXPISNEG;932break;933}934else if (ch == '+')935{936break;937}938} /* Note! Drop through to FPS_INEXP */939/*940** Processing the exponent part of number.941** Only allow digits.942*/943case FPS_INEXP:944{945digit = (unsigned char)(ch - '0');946if (digit > 9)947return(0);948949exponent = exponent * 10 + digit;950951break;952}953}954}955956/* If parser never made it to the exponent this is not a float. */957if (estate < FPS_STARTEXP)958return(0);959960/* Set the sign of the number. */961if (flag & NUMISNEG)962accum = -accum;963964/* If exponent is not 0 then adjust number by it. */965if (exponent != 0)966{967/* Determine if exponent is negative. */968if (flag & EXPISNEG)969{970exponent = -exponent;971}972/* power = 10^x */973power = (float)pow(10.0, exponent);974accum *= power;975}976977PUSHFLOAT(accum);978if (pVM->state == COMPILE)979fliteralIm(pVM);980981return(1);982}983984#endif /* FICL_WANT_FLOAT */985986/**************************************************************************987** Add float words to a system's dictionary.988** pSys -- Pointer to the FICL sytem to add float words to.989**************************************************************************/990void ficlCompileFloat(FICL_SYSTEM *pSys)991{992FICL_DICT *dp = pSys->dp;993assert(dp);994995#if FICL_WANT_FLOAT996dictAppendWord(dp, ">float", ToF, FW_DEFAULT);997/* d>f */998dictAppendWord(dp, "f!", Fstore, FW_DEFAULT);999dictAppendWord(dp, "f*", Fmul, FW_DEFAULT);1000dictAppendWord(dp, "f+", Fadd, FW_DEFAULT);1001dictAppendWord(dp, "f-", Fsub, FW_DEFAULT);1002dictAppendWord(dp, "f/", Fdiv, FW_DEFAULT);1003dictAppendWord(dp, "f0<", FzeroLess, FW_DEFAULT);1004dictAppendWord(dp, "f0=", FzeroEquals, FW_DEFAULT);1005dictAppendWord(dp, "f<", FisLess, FW_DEFAULT);1006/*1007f>d1008*/1009dictAppendWord(dp, "f@", Ffetch, FW_DEFAULT);1010/*1011falign1012faligned1013*/1014dictAppendWord(dp, "fconstant", Fconstant, FW_DEFAULT);1015dictAppendWord(dp, "fdepth", Fdepth, FW_DEFAULT);1016dictAppendWord(dp, "fdrop", Fdrop, FW_DEFAULT);1017dictAppendWord(dp, "fdup", Fdup, FW_DEFAULT);1018dictAppendWord(dp, "fliteral", fliteralIm, FW_IMMEDIATE);1019/*1020float+1021floats1022floor1023fmax1024fmin1025*/1026dictAppendWord(dp, "f?dup", FquestionDup, FW_DEFAULT);1027dictAppendWord(dp, "f=", FisEqual, FW_DEFAULT);1028dictAppendWord(dp, "f>", FisGreater, FW_DEFAULT);1029dictAppendWord(dp, "f0>", FzeroGreater, FW_DEFAULT);1030dictAppendWord(dp, "f2drop", FtwoDrop, FW_DEFAULT);1031dictAppendWord(dp, "f2dup", FtwoDup, FW_DEFAULT);1032dictAppendWord(dp, "f2over", FtwoOver, FW_DEFAULT);1033dictAppendWord(dp, "f2swap", FtwoSwap, FW_DEFAULT);1034dictAppendWord(dp, "f+!", FplusStore, FW_DEFAULT);1035dictAppendWord(dp, "f+i", Faddi, FW_DEFAULT);1036dictAppendWord(dp, "f-i", Fsubi, FW_DEFAULT);1037dictAppendWord(dp, "f*i", Fmuli, FW_DEFAULT);1038dictAppendWord(dp, "f/i", Fdivi, FW_DEFAULT);1039dictAppendWord(dp, "int>float", itof, FW_DEFAULT);1040dictAppendWord(dp, "float>int", Ftoi, FW_DEFAULT);1041dictAppendWord(dp, "f.", FDot, FW_DEFAULT);1042dictAppendWord(dp, "f.s", displayFStack, FW_DEFAULT);1043dictAppendWord(dp, "fe.", EDot, FW_DEFAULT);1044dictAppendWord(dp, "fover", Fover, FW_DEFAULT);1045dictAppendWord(dp, "fnegate", Fnegate, FW_DEFAULT);1046dictAppendWord(dp, "fpick", Fpick, FW_DEFAULT);1047dictAppendWord(dp, "froll", Froll, FW_DEFAULT);1048dictAppendWord(dp, "frot", Frot, FW_DEFAULT);1049dictAppendWord(dp, "fswap", Fswap, FW_DEFAULT);1050dictAppendWord(dp, "i-f", isubf, FW_DEFAULT);1051dictAppendWord(dp, "i/f", idivf, FW_DEFAULT);10521053dictAppendWord(dp, "float>", FFrom, FW_DEFAULT);10541055dictAppendWord(dp, "f-roll", FminusRoll, FW_DEFAULT);1056dictAppendWord(dp, "f-rot", Fminusrot, FW_DEFAULT);1057dictAppendWord(dp, "(fliteral)", fliteralParen, FW_COMPILE);10581059ficlSetEnv(pSys, "floating", FICL_FALSE); /* not all required words are present */1060ficlSetEnv(pSys, "floating-ext", FICL_FALSE);1061ficlSetEnv(pSys, "floating-stack", FICL_DEFAULT_STACK);1062#endif1063return;1064}1065106610671068