Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

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?

Tagged:

Comments

  • dave1707dave1707 Mod
    edited August 2016 Posts: 7,523

    @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
    
  • IgnatzIgnatz Mod
    Posts: 5,396

    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?

  • dave1707dave1707 Mod
    edited August 2016 Posts: 7,523

    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
    
  • edited August 2016 Posts: 13

    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 :(
    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:
    -- 
    -- 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 :)

  • dave1707dave1707 Mod
    Posts: 7,523

    @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.

  • edited August 2016 Posts: 13

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

  • dave1707dave1707 Mod
    edited August 2016 Posts: 7,523

    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.

Sign In or Register to comment.