Floating point conversion

Anything QL Software or Programming Related.
User avatar
pjw
QL Wafer Drive
Posts: 1286
Joined: Fri Jul 11, 2014 8:44 am
Location: Norway
Contact:

Re: Floating point conversion

Post by pjw »

Yes, Steve, I think you cracked it :) So in all its glory, here goes V0.01:

Code: Select all

10 ovf = 2 ^ 30
11 ov2 = 2 ^ 31
12 :
100 DEFine FuNction FLT$(n)
110 LOCal x, m, s
120 IF n = 0: RETurn FILL$('0', 12)
130 IF n < 0 THEN
140  s = -1: m = -n
150 ELSE
160  s = 1: m = n
170 END IF
180 :
190 IF m > ov2 THEN
200  FOR x = $81F TO $FFF
210   m = m / 2
220   IF m < ovf: EXIT x
230  END FOR x
240  m = m + m
250 ELSE
260  FOR x = $81F TO 0 STEP -1
270   IF m < ovf: m = m + m: ELSE : EXIT x
280  END FOR x
290 END IF
300 m = s * m
310 RETurn HEX$(x, 16) & HEX$(m, 32)
320 END DEFine FLT$
330 :


Per
dont be happy. worry
- ?
stevepoole
Super Gold Card
Posts: 712
Joined: Mon Nov 24, 2014 2:03 pm

Re: Floating point conversion

Post by stevepoole »

Hi Per,

Just been testing your latest version which seems to be dead accurate....

The first loop can also be written as :
for x = $81F to $FFF : if m < ov2 : exit x : else m = m / 2
This allows two lines to be deleted, but is it faster ?

Thanks for your code !
Best wishes,
Steve.


User avatar
pjw
QL Wafer Drive
Posts: 1286
Joined: Fri Jul 11, 2014 8:44 am
Location: Norway
Contact:

Re: Floating point conversion

Post by pjw »

stevepoole wrote:<>
The first loop can also be written as :
for x = $81F to $FFF : if m < ov2 : exit x : else m = m / 2
This allows two lines to be deleted, but is it faster ?
Hi Steve, theres probably not much in it, but a nice tweak all the same ;)
I got the general idea for the algorithm from doing the same in assembler (years ago when I still had some idea of what I was doing). The BASIC version was developed heuristically, without much engagement of the prefrontal cortex!
Ive been trying to shave off the last roxr.l ('cause that what it is), ie line 240 in the V0.01 code above, but havent found a way to do it yet. But perhaps tweaking this more is futile. What is needed is a different approach altogether. A certain person - he with "a brain the size of a planet", would probably reduce the whole thing to three lines of code (viz our foray into FIZZBUZZ some years back. Remember? :) )


Per
dont be happy. worry
- ?
stevepoole
Super Gold Card
Posts: 712
Joined: Mon Nov 24, 2014 2:03 pm

Re: Floating point conversion

Post by stevepoole »

Hi Per,

After still more testing, I note that the series -1, -2, -4, -8, -16 etc gives false results.

I have tweaked a bit, but still cannot locate the cause of the bug.

Perhaps you can ?

Regards,
Steve.


stevepoole
Super Gold Card
Posts: 712
Joined: Mon Nov 24, 2014 2:03 pm

Re: Floating point conversion

Post by stevepoole »

Hi again,

For correct powers of two, change the second loop :
for x=$81F to 0 step -1
if s=-1: if m<=ovf: m=m+m: else exit x
if s=+1: if m< ovf: m=m+m: else exit x
end for x

Tested for -1e-615, -1e615, -pi, pi, 1e615, 1e-615
That is a huge range to check in very small STEPs.
But seems OK for the moment.
Will keep running tests, as one tweak may upset other values...

Regards,
Steve.


User avatar
pjw
QL Wafer Drive
Posts: 1286
Joined: Fri Jul 11, 2014 8:44 am
Location: Norway
Contact:

Re: Floating point conversion

Post by pjw »

Theres been quite some activity behind the scenes here, and this is what weve come up with: (All previous versions are abominations and embarrassments and should be withdrawn from active service immediately and taken behind the woodshed and shot!):

Code: Select all

100 REMark ======================================================
110 REMark Float to Hex by pjw & steven pool
120 REMark V0.02, December 3rd 2017
130 :
140 DEFine FuNction FLTp$(n)
150 LOCal x, m, s
160 IF n = 0: RETurn FILL$('0', 12)
170 IF n < 0: s = -1: m = -n: ELSE : s = 1: m = n
180 IF m > -$80000000 THEN
190    FOR x = $81F TO $FFF
200       m= m / 2
210       IF m < $40000000: EXIT x
220    END FOR x
230    m = m + m
240 ELSE
250    FOR x = $81F TO 0 STEP -1
260       IF s = -1: IF m <= $40000000: m = m + m: ELSE EXIT x
270       IF s = +1: IF m <  $40000000: m = m + m: ELSE EXIT x
280    END FOR x
290 END IF
300 m = s * m
310 :
320 RETurn HEX$(x, 16) & HEX$(m, 32)
330 END DEFine FLTp$
340 :
The above shows something of whats going on, hence the inline hex. Howver, Qlib wont even discuss it,
so the below may be more suitable:

Code: Select all

10 ovf = 2^30: ov2 = 2^31: REMark Overflow limits
11 :
500 REMark ======================================================
510 REMark Float to Hex by Steve Pool & pjw
520 :
530 DEFine FuNction FLTs$(n)
540  LOCal x,m,s, x$(4), m$(8)
550   IF n=0: RETurn FILL$('0',12)
560   IF n<0: s=-1: m=-n
570   IF n>0: s=1 : m=n
580 IF m>ov2 THEN
590        FOR x=2079 TO 4095: m=m/2: IF m<ovf: EXIT x: END IF
600            m=m+m
610   ELSE FOR x=2079 TO 0 STEP -1
620        IF s=-1: IF m<=ovf: m=m+m: ELSE EXIT x: END IF
630        IF s=+1: IF m< ovf: m=m+m: ELSE EXIT x: END IF
640        END FOR x
650 END IF : m=s*m: x$=HEX$(x,16): m$=HEX$(m,32) : RETurn x$&m$
660 END DEFine
670 :
They both give correct answers for the whole range of floats (as far as weve been able to ascertain). However, whichever version you use: They are sadly slow when it comes to higher numbers, such as 9E615, as a lot of iterations have to be got through to normalise the numbers.
Strangely, although Qlib will compile it, it doesnt seem to work for numbers > 2^30 under Qlib! Dont yet know why (and Im not sure I care enough to find out!)

Finally, I wrote a single keyword toolkit in assembler. That works in about linear time (as the number it works with is already normalised). 104 bytes of code. Works across the range. If someone really needs this, and cant be bothered to write their own, they know where to get it!


Per
dont be happy. worry
- ?
stevepoole
Super Gold Card
Posts: 712
Joined: Mon Nov 24, 2014 2:03 pm

Re: Floating point conversion

Post by stevepoole »

Hi Martin,

Yes, I can confirm what Per has posted. The programs have been beta-tested and are bug-free now.
Tested Ok over the full floating-point range of -,+ 9E -,+ 615
And, they Turbo_Compile OK on my system, a QPC2 laptop.
Many thanks to Per for converting his _rext code into Basic for us all...

Regards,
Steve.


Martin_Head
Aurora
Posts: 847
Joined: Tue Dec 17, 2013 1:17 pm

Re: Floating point conversion

Post by Martin_Head »

Thanks Per and Steve for all the time and effort you have put in.

Martin


Post Reply