Calculator
#21
(Code deleted because of a math problem.)
Reply
#22
Try putting in .01 or .301 and see what you get.

Also, and this one is much tougher: .333333333333333 (.3 taken to 15-digits. Multiply by 3 and you get .9 to 15-digits. Fine, Do that with 3 with 16-digits and it reports 1.0. The trick is to design an algorithm that holds repeating digits so 1 / 3 * 3 = 1 but .3333333333333333 * 3 = .9999999999999999.

Pete
Reply
#23
Code: (Select All)
' Incomplete calculator - demonstration of a better way of using clickable buttons.  Let the program
' CALCULATE the button positions.  Code is shorter, simpler, self-documenting, and much easier to modify.

Dim ckey$(50), bx1(50), bx2(50), by1(50), by2(50), gbuffer(8000)
Screen _NewImage(800, 600, 32)
Dim As _Float acc, stack

For r = 1 To 9 '                                 row
    For c = 1 To 4 '                             column
        Read t$ '                                button contents
        If Len(t$) Then '                        not a blank button
            x1 = 20 + (c - 1) * 100 '            x start
            y1 = 99 + (r - 1) * 50 '             y start
            x2 = x1 + 60 '                       x end
            y2 = y1 + 30 '                       y end
            For t = 0 To 5 '                     shaded box
                Line (x1 + t, y1 + t)-(x2 - t, y2 - t), _RGB32(t * 42), B
            Next t
            _PrintString ((x2 + x1) \ 2 - _PrintWidth(t$) \ 2, y1 + 8), t$ '     centered button text
            n = n + 1 '                          button number
            ckey$(n) = t$: bx1(n) = x1: by1(n) = y1: bx2(n) = x2: by2(n) = y2 '  store button
        End If
    Next c
Next r '                                        done generating, displaying, and storing buttons

Do
    _PrintString (20, 30), Str$(acc) + Space$(20) '   show accumulator
    _PrintString (20, 60), Space$(20) '               blank line
    If Len(op$) Then _PrintString (20, 60), Str$(stack) + op$

    Do: _Limit 20 '                                   check keyboard and mouse
        i$ = InKey$
        If Len(i$) Then '                             keyboard key has been pressed
            If i$ = Chr$(27) Then System '            Esc quits
            If i$ = Chr$(13) Then i$ = "=" '          key remapping
            If i$ = "c" Then i$ = "CLR" '             key remapping
            If i$ = "*" Then i$ = "x" '               key remapping
            For i = 1 To n '                          does this key match a button?
                If i$ = ckey$(i) Then hit = i '       yes, save which one
            Next i
        Else '                                        check mouse
            While _MouseInput: Wend
            mx = _MouseX: my = _MouseY
            For i = 1 To n
                Line (bx1(i), by1(i))-(bx2(i), by2(i)), _RGB32(0), B
                If (mx > bx1(i)) And (mx < bx2(i)) And (my > by1(i)) And (my < by2(i)) Then
                    Line (bx1(i), by1(i))-(bx2(i), by2(i)), _RGB32(255), B
                    If _MouseButton(1) Then hit = i: i$ = ckey$(i)
                End If
            Next i
        End If
    Loop Until hit

    i = hit: hit = 0
    Get (bx1(i), by1(i))-(bx2(i), by2(i)), gbuffer(0) '
    Put (bx1(i), by1(i)), gbuffer(), PReset '    highlight key
    _Delay .2 '                                  ensure user has time to see highlight
    Put (bx1(i), by1(i)), gbuffer(), PSet '      restore key

    If InStr("0123456789", i$) Then '            entering a number
        If div = 0 Then acc = 0: div = 1
        If div > 1 Then
            acc = acc + Val(i$) / div
            div = div * 10
        Else
            acc = acc * 10 + Val(i$)
        End If
    ElseIf InStr("+-x/", i$) Then '              operator
        op$ = i$
        stack = acc
        acc = 0
    End If

    Select Case i$ '                             other buttons, many non-functional for this demo
        Case Is = "="
            If op$ = "+" Then acc = stack + acc
            If op$ = "-" Then acc = stack - acc
            If op$ = "x" Then acc = stack * acc
            If op$ = "/" Then acc = stack / acc
            op$ = ""
            stack = 0
            div = 0
        Case Is = ".": div = 10
        Case Is = "CLR": acc = 0: stack = 0: op$ = ""
        Case Is = "ûx": acc = Sqr(acc)
        Case Is = "Sin": acc = Sin(acc)
        Case Is = "Cos": acc = Cos(acc)
        Case Is = "Tan": acc = Tan(acc)
        Case Is = "Deg": angle_mode = angle_mode Xor 1
        Case Is = "xý": acc = acc * acc
        Case Is = "Log": acc = Log(acc)
        Case Is = "pi": acc = _Pi
        Case Is = "1/x": If acc > 0 Then acc = 1 / acc
        Case Is = "x/2": acc = acc / 2
        Case Is = "Exp"
        Case Is = "+/-": acc = -acc
        Case Is = "Copy" '
        Case Is = "Paste"
        Case Is = "<Back" '
        Case Is = "RND": acc = Rnd
    End Select
Loop

Data ,,,CLR
Data ûx,Sin,Cos,Tan
Data 7,8,9,/
Data 4,5,6,x
Data 1,2,3,-
Data 0,.,=,+
Data Deg,xý,Log,pi
Data "1/x",x/2,Exp,+/-
Reply
#24
@ChiaPet, Beautiful elegance!

Too bad you left this Data Line out:
DATA Copy,Paste, <Back, RND

I think those are missing items from Case Is code. I see your _delay .2 is later.
b = b + ...
Reply
#25
Pete, yeah it's not exactly a scientific calculator and I believe QB64 rounds it off if you go too far in the decimal range. Thanks for showing me but I'm just going to leave it like it is. I don't know enough math to make such an algorithm and I don't think .000000000000001 will make much difference with anything, unless like I said, you are a scientist or mathematician. LOL
Reply
#26
(07-27-2022, 03:31 PM)SierraKen Wrote: Pete, yeah it's not exactly a scientific calculator and I believe QB64 rounds it off if you go too far in the decimal range. Thanks for showing me but I'm just going to leave it like it is. I don't know enough math to make such an algorithm and I don't think .000000000000001 will make much difference with anything, unless like I said, you are a scientist or mathematician. LOL

@Ken, there is an error in the calculations that appears to be related to the zero.

For example:
0.01 -> 1 -> x 3 = 3 Correct: 0.03
1.02 -> 12 -> / 3 = 4 Correct: 0.34

The problem is: ".0"

[Image: Nullproblem.jpg]

Reply
#27
(07-27-2022, 03:31 PM)SierraKen Wrote: Pete, yeah it's not exactly a scientific calculator and I believe QB64 rounds it off if you go too far in the decimal range. Thanks for showing me but I'm just going to leave it like it is. I don't know enough math to make such an algorithm and I don't think .000000000000001 will make much difference with anything, unless like I said, you are a scientist or mathematician. LOL

Oh come on! I want a calculator that can give me the correct re-PETE-nd for 1/97. So I want to see a readout of 96 digits...

.010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567...

Kidding aside, I hear ya. Now I can easily get the above answer with my string math routine, but I have yet to work out a suitable method to track division with repeating so dividing several times and then multiplying back the reverse the same number of times would always arrive at the original number. So even looking at a simple 1 / 3 = . 3... then * 3 should = 1 but without a way to tag the quotient as a repeating decimal, the routine returns .9... instead of one. So if I set to display 60 decimal places, I would get:

.999999999999999999999999999999999999999999999999999999999999

Now if I had tagged the .3 repeating decimal and multiplied it by 3, I'd be tempted to round up the readout to "1" and clear the tag. If the calculation was 2 / 3, however, I'm confronted with .6... and if I tag it and multiple it back by 3 and use the same round up method, I'd get 1.8 rounded up to 1.9, fail! It should be 2. So simple rounding doesn't cut it.

Anyway, blah, blah, blah aside... Please take a look at the other part of my post, which stated:

"Try putting in .01 or .301 and see what you get." As is press the buttons to input .01 or .301 and the readout fails to register that input correctly.

I think while I was writing this post Kernelpanic touched on the same bug.

Pete
Reply
#28
Wow thanks guys for telling me. It had something to do with the STR$ and VAL commands in the wrong places, so I played around with it and fixed it. 

Here is the update: 

(Woops I was wrong, disregard this post.)
Reply
#29
I've tried a few things with no luck so far. I need to give this app a rest for awhile, so right now it will be on hold until I fix it or someone else fixes it. Please delete what you have already unless you want to help me with it. I think it is a problem with STR$ or VAL rounding off anything below 0.1 to zero. I'm not sure how to fix that.
Reply
#30
(07-27-2022, 08:02 PM)SierraKen Wrote: (Woops I was wrong, disregard this post.)

Keep cool!  Wink Your program is OK . . . only 4 + 4 = 5 . . . there is a little problem.  Big Grin

Reply




Users browsing this thread: 1 Guest(s)