Hola Spirio, all,
Thanks for the code, Spirio. Since I just can't stand being outdone
(actually because I got curious) I attempted to write a conversion
routine. Actually I wrote two; one is fast, the other is maybe a little
more compact. Maybe someone can improve on them? I tested them on 10,
-0.5, and sqrt(2).
Hope someone finds this useful!
-S
First the fast one, which converts the number to base 256 and then shifts
left as necessary (since the float can go from 2^-128 to 2^126, it can
basically go from 256^-16 to 256^16):
---
/*
* num2float.c
*
* Convert number to C64 floating-point format.
*
* SLJ 10/19/00
*/
#include <stdio.h>
int main(int argc, char** argv[])
{
int i,sign;
unsigned long c1,c2,offset,ei;
unsigned char digit[33];
double num=1.4142135624,a;
if (num == 0) printf("Oh come on. Zero! 00 00 00 00 00\n");
printf("Original number = %f\n",num);
if (num < 0) {
sign=128;
num = -num;
} else sign=0;
a = 1;
for (i=0; i<16; i++) { /* a = 256^16 */
a = a*256;
}
ei=32; /* convert to base 256 */
for (i=0; i<33; i++) {
if (num >= a) {
digit[i] = num/a;
num = num - a*digit[i];
if (i < ei) ei = i; /* first nonzero byte */
} else digit[i] = 0;
a = a/256;
}
offset = 0;
while (digit[ei] < 128 &&
digit[ei] != 0) { /* Shift left to get first 1 */
offset++;
c1=0;
for (i=32; i>=ei; i--) {
if (digit[i] < 128) c2=0; else c2=1;
digit[i] = digit[i]*2 + c1;
c1 = c2;
}
}
digit[ei] = (digit[ei]-128) | sign;
printf("C64 float = %d %d %d %d %d\n",129 + 8*(16-ei)+7 - offset,
digit[ei],digit[ei+1],digit[ei+2],digit[ei+3]);
}
---
The "slow" one just does a straight binary conversion:
---
/*
* num2float.c
*
* Convert number to C64 floating-point format -- slow but compact.
*
* SLJ 10/19/00
*/
#include <stdio.h>
int main(int argc, char** argv[])
{
int i,sign,bit,byte,flag,count,ei;
unsigned char digit[5];
double num=1.4142135624,a;
if (num == 0) printf("Oh come on. Zero! 00 00 00 00 00\n");
printf("Original number = %f\n",num);
if (num < 0) {
sign=128;
num = -num;
} else sign=0;
a = 1;
for (i=0; i<126; i++) { /* a = 2^126 */
a = a*2;
}
byte=0;
flag=0;
count=0;
for (i=126; i>=-128 && byte<4; i--) {
if (num >= a) {
bit=1;
if (flag == 0) ei = i;
flag=1;
} else bit=0;
if (flag == 1) {
digit[byte] = digit[byte]*2 + bit;
count++;
if (count > 7) {
count = 0;
byte++;
}
num = num - a*bit;
}
a = a/2;
}
digit[0] = (digit[0]-128) | sign;
printf("C64 float = %d %d %d %d %d\n",129 + ei,
digit[0],digit[1],digit[2],digit[3]);
}
-
This message was sent through the cbm-hackers mailing list.
To unsubscribe: echo unsubscribe | mail cbm-hackers-request@dot.tml.hut.fi.
Archive generated by hypermail 2.1.1.