How to use @autojit high precision floating point

I've been busy with my Mendelbrot generator program, which is currently running with autojit (gpu parallelism) to improve performance. The point is that it only works when the floating point is accurate enough.

Is there a way (or a library) to increase the floating point precision and still be able to use autojit's performance enhancement feature?

I've tried bigfloat (couldn't get it to work) and mpmath (ignores autojit, very slow).

My program:

import numpy
import threading
import math
import time
import os
import subprocess
import winsound
from numba import autojit
from PIL import Image
from mpmath import *

def drawSet(iterations,startX,startY):
    print("")
    print("Calculating Values, please wait".center(80))  
    global SIZEW, ZOOM, SIZEH
    def drawList(lista,iterations):
        global data,SIZEW,SIZEH,COLORS
        subprocess.call('cls',shell=True)
        print("")
        print("Drawing fractal, please wait".center(80))
        for y in range(0,SIZEH):
            for x in range(0,SIZEW):
                if lista[x][y]==iterations:
                    data[y,x] = [0,0,0]
                else:
                    data[y,x] = COLORS[lista[x][y]%(len(COLORS))]
    #----------------------------------------------
    @autojit
    def DoIters(x,y,iterations):
        c=complex(x,y)
        c1=complex(x,y)
        for i in range(iterations):
            c=c**2+c1
            if c.real**2+c.imag**2>=4:
                return i
        return iterations
    #-----------------------------------------------
    def constrNumbers(startX,startY,step,step2,iterations): #WORKS
        global SIZEW,SIZEH,PROGRESS, EPOCH, numbers
        PROGRESS+=1   
        y1=startY
        for y in range(SIZEH): #sumnjivo
            x1=startX
            for x in range(SIZEW):
                numbers[x][y]=DoIters(x1,y1,iterations)
                x1+=step2
            y1+=step
        drawList(numbers,iterations)
        img = Image.fromarray(data, 'RGB')
        img.save("mendelbrot_screens/"+str(EPOCH)+"/"+str(PROGRESS)+".gif")
    #----------------------------------------------
    step=(1/ZOOM)*(4/SIZEW)
    step2=step*(SIZEH/SIZEW)
    #----------------------------------------------
    numbers=[[-1 for y in range(SIZEH)] for x in range(SIZEW)]    
    constrNumbers(startX,startY,step,step2,iterations)

def updateSet(): #always works tested
    global ZOOM, ITERATIONS, FOCUSX, FOCUSY,SIZEW,SIZEH
    ITERATIONS=round(math.sqrt(abs(2*math.sqrt(abs(1-math.sqrt(5*ZOOM)))))*66.5)
    subprocess.call('cls',shell=True)
    moder=2/ZOOM
    startX=(FOCUSX-moder)*(SIZEW/SIZEH)
    startY=FOCUSY-moder
    drawSet(ITERATIONS, startX, startY)


#########################################################################################################
####GLOBALS
#---------------------------
#http://www.bretttolbert.com/projects/colorscale/
#Output: RGB values Integer [0-255] CSS syntax (array)
COLORS2=['rgb(230,46,68)', 'rgb(230,46,90)', 'rgb(230,46,112)', 'rgb(230,46,134)', 'rgb(230,46,156)', 'rgb(230,46,178)', 'rgb(230,46,200)', 'rgb(230,46,223)', 'rgb(215,46,230)', 'rgb(193,46,230)', 'rgb(171,46,230)', 'rgb(149,46,230)', 'rgb(127,46,230)', 'rgb(105,46,230)', 'rgb(83,46,230)', 'rgb(61,46,230)', 'rgb(46,53,230)', 'rgb(46,76,230)', 'rgb(46,98,230)', 'rgb(46,120,231)', 'rgb(46,142,231)', 'rgb(46,164,231)', 'rgb(46,186,231)', 'rgb(46,209,231)', 'rgb(46,231,231)', 'rgb(46,231,209)', 'rgb(46,231,187)', 'rgb(46,231,164)', 'rgb(46,231,142)', 'rgb(46,231,120)', 'rgb(46,231,98)', 'rgb(46,231,76)', 'rgb(46,231,54)', 'rgb(61,231,46)', 'rgb(83,231,46)', 'rgb(105,231,46)', 'rgb(128,231,46)', 'rgb(150,231,46)', 'rgb(172,231,46)', 'rgb(194,232,46)', 'rgb(217,232,46)', 'rgb(232,224,46)', 'rgb(232,202,46)', 'rgb(232,180,46)', 'rgb(232,158,46)', 'rgb(232,135,46)', 'rgb(232,113,46)', 'rgb(232,91,46)', 'rgb(232,69,46)', 'rgb(232,46,46)']
COLORS3=['rgb(121,175,218)', 'rgb(120,177,218)', 'rgb(118,179,217)', 'rgb(117,182,216)', 'rgb(115,184,215)', 'rgb(114,187,214)', 'rgb(112,189,214)', 'rgb(110,192,213)', 'rgb(109,194,212)', 'rgb(107,197,211)', 'rgb(106,200,210)', 'rgb(105,203,210)', 'rgb(103,205,209)', 'rgb(102,208,207)', 'rgb(100,207,203)', 'rgb(99,206,198)', 'rgb(97,205,194)', 'rgb(96,205,189)', 'rgb(94,204,184)', 'rgb(93,203,180)', 'rgb(92,202,175)', 'rgb(90,201,170)', 'rgb(89,201,165)', 'rgb(87,200,160)', 'rgb(86,199,155)', 'rgb(85,198,150)', 'rgb(83,197,145)', 'rgb(82,196,140)', 'rgb(81,196,135)', 'rgb(79,195,130)', 'rgb(78,194,125)', 'rgb(77,193,120)', 'rgb(75,192,114)', 'rgb(74,192,109)', 'rgb(73,191,104)', 'rgb(71,190,99)', 'rgb(70,189,93)', 'rgb(69,188,88)', 'rgb(68,187,83)', 'rgb(66,187,77)', 'rgb(65,186,72)', 'rgb(64,185,66)', 'rgb(65,184,63)', 'rgb(68,183,62)', 'rgb(71,183,60)', 'rgb(74,182,59)', 'rgb(77,181,58)', 'rgb(80,180,57)', 'rgb(83,179,56)', 'rgb(86,179,54)', 'rgb(90,178,53)', 'rgb(93,177,52)', 'rgb(96,176,51)', 'rgb(100,175,50)', 'rgb(103,174,49)', 'rgb(107,174,48)', 'rgb(110,173,47)', 'rgb(113,172,45)', 'rgb(117,171,44)', 'rgb(120,170,43)', 'rgb(124,170,42)', 'rgb(127,169,41)', 'rgb(131,168,40)', 'rgb(135,167,39)', 'rgb(138,166,38)', 'rgb(142,165,37)', 'rgb(145,165,36)', 'rgb(149,164,35)', 'rgb(153,163,34)', 'rgb(156,162,33)', 'rgb(160,161,32)', 'rgb(161,157,31)', 'rgb(160,152,30)', 'rgb(159,147,29)', 'rgb(158,141,28)', 'rgb(157,136,27)', 'rgb(156,131,26)', 'rgb(156,125,25)', 'rgb(155,120,24)', 'rgb(154,114,23)', 'rgb(153,109,23)', 'rgb(152,104,22)', 'rgb(152,98,21)', 'rgb(151,93,20)', 'rgb(150,87,19)', 'rgb(149,82,18)', 'rgb(148,77,17)', 'rgb(147,71,16)', 'rgb(147,66,16)', 'rgb(146,60,15)', 'rgb(145,55,14)', 'rgb(144,50,13)', 'rgb(143,44,12)', 'rgb(143,39,11)', 'rgb(142,34,11)', 'rgb(141,28,10)', 'rgb(140,23,9)', 'rgb(139,18,8)', 'rgb(139,12,8)', 'rgb(138,7,7)']
COLORS4=['rgb(191,0,0)', 'rgb(192,11,0)', 'rgb(192,23,0)', 'rgb(192,34,1)', 'rgb(193,45,1)', 'rgb(193,57,1)', 'rgb(194,68,1)', 'rgb(194,80,1)', 'rgb(194,91,2)', 'rgb(195,103,2)', 'rgb(195,114,2)', 'rgb(195,126,2)', 'rgb(196,137,2)', 'rgb(196,149,3)', 'rgb(197,161,3)', 'rgb(197,172,3)', 'rgb(197,184,3)', 'rgb(198,196,3)', 'rgb(189,198,4)', 'rgb(178,199,4)', 'rgb(167,199,4)', 'rgb(156,199,4)', 'rgb(145,200,4)', 'rgb(134,200,5)', 'rgb(123,200,5)', 'rgb(112,201,5)', 'rgb(101,201,5)', 'rgb(90,202,5)', 'rgb(79,202,6)', 'rgb(67,202,6)', 'rgb(56,203,6)', 'rgb(45,203,6)', 'rgb(34,203,7)', 'rgb(23,204,7)', 'rgb(11,204,7)', 'rgb(7,205,14)', 'rgb(7,205,26)', 'rgb(8,205,38)', 'rgb(8,206,49)', 'rgb(8,206,61)', 'rgb(8,207,73)', 'rgb(8,207,85)', 'rgb(9,207,97)', 'rgb(9,208,109)', 'rgb(9,208,120)', 'rgb(9,208,132)', 'rgb(10,209,144)', 'rgb(10,209,156)', 'rgb(10,210,168)', 'rgb(10,210,180)', 'rgb(11,210,192)', 'rgb(11,211,204)', 'rgb(11,206,211)', 'rgb(11,195,212)', 'rgb(11,184,212)', 'rgb(12,172,212)', 'rgb(12,161,213)', 'rgb(12,150,213)', 'rgb(12,138,213)', 'rgb(13,127,214)', 'rgb(13,116,214)', 'rgb(13,104,215)', 'rgb(13,93,215)', 'rgb(14,81,215)', 'rgb(14,70,216)', 'rgb(14,58,216)', 'rgb(14,47,216)', 'rgb(15,35,217)', 'rgb(15,24,217)', 'rgb(18,15,218)', 'rgb(30,15,218)', 'rgb(42,16,218)', 'rgb(54,16,219)', 'rgb(66,16,219)', 'rgb(78,16,220)', 'rgb(90,16,220)', 'rgb(102,17,220)', 'rgb(115,17,221)', 'rgb(127,17,221)', 'rgb(139,17,221)', 'rgb(151,18,222)', 'rgb(163,18,222)', 'rgb(176,18,223)', 'rgb(188,19,223)', 'rgb(200,19,223)', 'rgb(212,19,224)', 'rgb(224,19,224)', 'rgb(225,20,212)', 'rgb(225,20,201)', 'rgb(225,20,189)', 'rgb(226,20,177)', 'rgb(226,21,166)', 'rgb(226,21,154)', 'rgb(227,21,143)', 'rgb(227,21,131)', 'rgb(228,22,119)', 'rgb(228,22,108)', 'rgb(228,22,96)', 'rgb(229,22,84)', 'rgb(229,23,73)']
#---------------------------
COLORS=[]
for i in COLORS2:
    string2=i[4:]
    string3=string2[:len(string2)-1]
    lista1=string3.split(",")
    COLORS.append([int(lista1[0]),int(lista1[1]),int(lista1[2])])
#------
SIZEW=1080
SIZEH=1080
ZOOM=1 #can be up to 10**13, breaks afterwards
numbers=[[-1 for y in range(SIZEH)] for x in range(SIZEW)]  
FOCUSX=-1.7400623827933990522084416706582563829664172043617186687986241846118291964415305605484071833948322574345000825
FOCUSY=0.02817533977921104899241152114431950968753907674299060857040130959588017432409201863854008146585605536156950844
PROGRESS=-1
FIRSTTIME=1
XREAL=0
YREAL=0
READY=1
ITERATIONS=1
#--------------------------
EPOCH = int(time.time())
try:
    os.stat("mendelbrot_screens")
except:
    os.mkdir("mendelbrot_screens")

os.mkdir("mendelbrot_screens/"+str(EPOCH))
#---------------------------
data = numpy.zeros((SIZEW,SIZEH,3), dtype=numpy.uint8)  
updateSet()

      

EDIT: The program is saving the sets as images, since I am going to output the video from it.

+3


source to share





All Articles