Frank Buss <fb@[EMAIL PROTECTED]
> wrote:
> Looks like these 2 words are missing in ficl. Maybe there are other
useful
> words to convert integers to floats and vice-versa?
> I need the conversion, so I've implemented a first hack:
> static void ficlPrimitiveD2F(ficlVm *vm)
> {
> ficlInteger doubleLow;
> ficlStackPopInteger(vm->dataStack); // ignore double high
> doubleLow = ficlStackPopInteger(vm->dataStack);
> ficlStackPushFloat(vm->floatStack, (float) doubleLow);
> }
> static void ficlPrimitiveF2D(ficlVm *vm)
> {
> float f = ficlStackPopFloat(vm->floatStack);
> ficlInteger doubleLow = (ficlInteger) f;
> ficlInteger doubleHigh = doubleLow < 0 ? -1 : 0;
> ficlStackPu****nteger(vm->dataStack, doubleLow);
> ficlStackPu****nteger(vm->dataStack, doubleHigh);
> }
> and the registering part:
> ficlDictionarySetPrimitive(dictionary, "d>f", ficlPrimitiveD2F,
> FICL_WORD_DEFAULT);
> ficlDictionarySetPrimitive(dictionary, "f>d", ficlPrimitiveF2D,
> FICL_WORD_DEFAULT);
> But this doesn't work. Looks like ficl saves a double in low/high
format.
> This is the output of Win32Forth:
> 12. . .
> 0 12
> and this on ficl (compiled on an ARM platform) :
> 12. . .
> 12 0
> Which one is the right one?
Win32Forth is right.
I don't understand what the word "above" means
> in "3.1.4.1 Double-cell integers".
> For me it looks better to push the high value as the last item on stack,
> because then I can just drop it, if not needed, instead of "swap drop",
Exactly right. That's the reason.
Andrew.


|