In pratica oltre all'utilizzo della matematica intera viene calcolata una tabella di lookup dei quadrati dei numeri interi da 0 a 127 in modo che nel ciclo iterativo non si debbano fare i calcoli ma basti recuperare il risultato dalla tabella (la tabella non contiene i quadrati ma i quadrati divisi per il fattore di scala ovvero divisi per 64, operazione che viene effettuata con un bit shift di 6 posizioni)
Con la speranza di fare un porting verso C64 i numeri interi sono compresi da 0 a 65535 con un fattore di scala di 64 (-128 = -2.0, 127=2.0, la tabella dei quadrati non e' necessario che abbia i numeri negativi )
Per evitare di leggere fuori dalla tabella con relativo segmentation fault prima deve essere verifcato che l'indice sia inferiore a 127
---------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int quadrati[127];
int zr,zi,a,k;
// base 1 = 64
int main()
{
// crea matrice dei quadrati
for (int i=0;i<128;i++){
quadrati[i] = (i*i)>>6;
}
for (int jr=-127; jr<127; jr++)
{
for (int ji=-127; ji<127; ji++)
{
zi = zr = 0;
for (k=0; k<=25; k++)
{
a = quadrati[abs(zr)] - quadrati[abs(zi)] + jr;
zi = quadrati[abs(zr)] + quadrati[abs(zi)] - quadrati[abs(zr-zi)] + ji;
zr = a;
if ((abs(zi) >126) || (abs(zr)>126))
{
break;
}
if ((quadrati[abs(zr)]+quadrati[abs(zi)]) > 256)
{
break;
}
}
if (k > 24)
{printf("O");}
else
{printf(" ");}
}
printf("\n");
}
return 0;
}
Nessun commento:
Posta un commento