Nan value is stuck

I have two variables x,y that are calculating very small numbers between 0 and 1 depending on variables a and b. It is understandable that the values are going to sometimes come up as “nan”. However, when I set a and b to values that make x or y a small number, then a value that computes nan for x or y, then set a or b back to what should compute a small number again, the values stay as nan. The project is running while doing those steps. Can someone try this out to see if it’s a bug, or just a problem in my code? Or teach me how to round to the nearest nth?

@PlatniumFrog If you want to check if a value is nan, then check the value against itself. If it’s not equal to itself, it’s nan.

function setup()
    a=0/0
    print(a)
    if a~=a then
        print("a = nan, setting a to 0")
        a=0
    end 
    print("a = ",a)
end

If you still have problems, post the code

Could I have a function that rounds an oversized decimal to the maximum number of decimal places a number can have in codea/lua?

Here’s a routine. Pass it a number and how many decimal places you want. Just figure out how many decimal places you want. If you always want a fixed number of decimal places, replace dp with that value.

EDIT: The number of decimal places you can have will depend on how many digits are before the decimal point.

EDIT: With this routine, it looks like you can have a total of 14 digits.

function setup()
    a=123.45678901645678912
    b=round(a,8)
    print(b)
end

function round(val,dp)
    return((val*10^dp+0.5)//1)/10^dp
end

Here is what I have been trying to build.
The forum post handler leaves out multiplication stars and auto detects code which personally is slightly annoying :frowning:
Ths means that to use this while in the codea editor, you will have to insert a multiplication star inbetween joined variables.
Obviously all varibles are defined in the setup function so you will have no trouble.
Code starts here and ends before “code stops”:

-- Fractler
-- This draws a mandlebrot fractal and later will draw custom fractals given a mathimatical formula
-- code is translated to lua from the code discussed in this video:
-- https://youtu.be/WXdB_cLe8ZI
-- Use this function to perform your initial setup
function setup()
    -- canvas x and y values
    canX = 175
    canY = 175
    
    -- the shapes that can be drawn are "point", "circle", and "rect"
    shape = "rect"

    -- values used for mathimatical formulas
    -- (I haven't gotten the fornula right...)
    x = 0
    y = 0
    a = -2
    b = -2
    
    -- res is a value between 0 and 1 that is how detailed the fractal renders
    res = 0.05
    
    -- this table contains "valid" points and is explained later
    points = {}
    
    -- this bool tell wether the fractal is done rendering
    finished = false
    
    -- this is used to tell where to add walues to "points"
    key = 0
end
-- functions separator and console are going to be used later for creating custom fractals
function separator()
    pushStyle()
    pushMatrix()
    strokeWidth(5)
    stroke(0, 0, 0, 128)
    line(200,0,200,HEIGHT)
    popMatrix()
    popStyle()
end
function console()
    s = keyboardBuffer()
    pushStyle()
    pushMatrix()
    textAlign(LEFT)
    textWrapWidth(180)
    fill(0, 0, 0, 128)
    fontSize(20)
    text(s,20,(HEIGHT/2)+200)
    popMatrix()
    popStyle()
end
-- the function below has not been implemented
-- function round(val,dp)
    -- return((val*10^dp+0.5)//1)/10^dp
-- end
-- This function gets called once every frame
function diverges()
    -- the point at which the mandlebrot set diverges
    -- is 2 from the center
        if (x*x)+(y*y) < 4 then
            return true
        else
            return false
        end
end

function iterate(n)
    -- this function contains formulas that can be called over and over again
    -- to iterate
    for i=0,1,n do
        local tmp = (x*x) - (y*y) + a
        y = (x*y) + (x*y) + b
        x = tmp
    end
end

function draw()
    --[[if CurrentTouch.state == BEGAN
    and CurrentTouch.x <= 200 then
        showKeyboard()
    end]]
    -- This sets a light background color 
    background(0, 11, 25, 255)
    -- this draws all the points that are within the fractal
    for i=0,1,res do
        iterate(res) -- this iterates the mathimatical funtion for each
                     -- value of "a" and "b"
        if finished == false then
            -- this makes "a" and "b" go through all values
            -- between 2 and -2
            if a <= 2 then
                a = a + res
            end
            if a >= 2 then
                if b <= 2 then
                a = -2
                b = b + res
                end
            end
            if b >= 2 then
                -- this discontiues the loop by setting "finished"
                -- to "true" when the loop requires it to be "false"
                finished = true
                a = -2
                b = -2
            end
            if diverges() == true then
                -- if the point does not diverge, then we add it to
                -- the table with a key greater than the previous key by 1
                key = key + 1
                points[key] = {a = a,b = b}
            end
        end
    end
    fill(3, 0, 38, 255)
    rect((WIDTH/2)-(canX*2),(HEIGHT/2)-(canY*2),canX*4,canY*4)
    fill(89, 255, 0, 255)
    for k,v in pairs(points) do
        -- this draws all the points
            pushStyle()
            noSmooth()
            if shape == "point" then
            point((WIDTH/2)+(v.a*canX),(HEIGHT/2)+(v.b*canY))
            end
            if shape == "rect" then
            rect((WIDTH/2)+(v.a*canX),(HEIGHT/2)+(v.b*canY),canX*res,canY*res)
            end
            if shape == "circle" then
            ellipse((WIDTH/2)+(v.a*canX),(HEIGHT/2)+(v.b*canY),canX*res,canY*res)
            end
            smooth()
            popStyle()
    end
    
    -- below are safe guards from Nan and inf values
    -- I would like them to round these numbers instead of
    -- setting them to 0.
    -- Codeas values dont change/get stuck when they have the value of Nan or inf
    if x ~= x then
        x = 0
    end
    if y ~= y then
        y = 0
    end
    -- below certain variables are printed so I can view them live
    text(x.." "..y,WIDTH/2,HEIGHT-20)
    text(a.." "..b,WIDTH/2,HEIGHT-40)
    text(tostring(diverges()).." "..key,WIDTH/2,HEIGHT-60)
end

Code stops

Cool right? Anyway, the reason behind all this is that I am trying to get the Mandelbrot formula right. You can copy/paste this if you want to check it out :slight_smile:

@PlatniumFrog Anytime you want to post code, put 3 ~'s on a line before and after the code so it formats correctly. I added them to your code above. There is a Mandelbrot example included with Codea. You can look at it for the formula.

I knew that, but I thought that it just edited the sprite/icon. Am I wrong?

The Mandelbrot example creates the Mandelbrot image. You can change the limit of the Mandelbrot calculations. I have some code for Mandelbrot that allows you to change the limit and also zoom in on selected areas.

@PlatniumFrog See this link for a better Codea Mandelbrot program.

https://codea.io/talk/discussion/2213/mandelbrot-essl-an-experiment-with-fragment-shaders-codea-1-5