Author Topic: Language  (Read 8974 times)

0 Members and 1 Guest are viewing this topic.

Offline Colonel_Panic

  • Newbie
  • Posts: 54
    • View Profile
Language
« on: November 07, 2021, 10:23:19 pm »
This is the first place online where I have *seen* stuff just like mine.
which makes me feel sort of "at home" I suppose.

LANGUAGE
=======
I have seen stuff like this called a "math module", and its a good description.
it continually asks you for an "expression to evaluate".

you are making variable assignments;
 the variable list "grows" at the top of the screen
if you enter:
x=2
y=3
z=((x*2)+(y*4))/2

you can watch as it keeps track and performs the evaluation(s)

this module, one just like it... is always my "ground zero" if I
am going to do any kind of "make my own language" work. Which is
why its called "language". I have used these routines several times in the past, they never fail me.

this is a stripped down special version, where it stops and shows you, step by step,
each "pass" as it reduces the math expression. In real life, it just SPITS it back out,
it seems instantaneous.

In one of my projects, I might have to calculate algebraic expressions, out of a $string.
this module will obviously be re-purposed for that.

LINUX MINT executable:
 

got code?

Code: QB64: [Select]
  1. NumVars = 0
  2. DIM VN$(128), VV(128)
  3.  
  4. AnotherExpression:
  5. FOR t = 1 TO NumVars
  6.   PRINT VN$(t); " ="; VV(t)
  7. PRINT "Enter expression to evaluate :";
  8. PRINT "-----------------------------"
  9. 'strip the spaces; meaningless in a math expression
  10. N1$ = ""
  11. FOR t = 1 TO LEN(z$)
  12.   IF MID$(z$, t, 1) <> " " THEN N1$ = N1$ + MID$(z$, t, 1)
  13. z$=N1$
  14. 'check for assignment
  15. VarFlag = 0
  16. FOR t = 2 TO LEN(z$)
  17.   IF MID$(z$, t, 1) = "=" THEN
  18.     GOSUB Assign:
  19.     IF VarFlag > 0 THEN z$ = EXP$: GOTO Start:
  20.   END IF
  21.  
  22. Start:
  23. pErrL = 0: pErrR = 0 'checks L's = R's
  24. pErr = 0 'other error(s)
  25. FOR t = 1 TO LEN(z$) 'check # of P's match
  26.   IF MID$(z$, t, 1) = "(" THEN pErrL = pErrL + 1
  27.   IF MID$(z$, t, 1) = ")" THEN pErrR = pErrR + 1
  28. IF (pErrL <> pErrR) THEN
  29.   PRINT "Fatal Error; (="; pErrL; "and )="; pErrR
  30.   PRINT "press <ENTER> :";: LINE INPUT nothing$
  31.   CLS: GOTO AnotherExpression:
  32. pErrL = 0: pErrR = 0
  33. FOR t = 1 TO LEN(z$)
  34.   IF MID$(z$, t, 1) = "(" THEN pErrL = pErrL + 1
  35.   IF MID$(z$, t, 1) = ")" THEN pErrR = pErrR + 1
  36.   IF pErrL = 0 AND pErrR = 1 THEN
  37.     PRINT "Fatal Error; 1st Paren must be a ("
  38.     PRINT "press <ENTER> :";: LINE INPUT nothing$
  39.     CLS: GOTO AnotherExpression:
  40.   END IF
  41.  
  42. pErrL = 0: pErrR = 0
  43. FOR t = LEN(z$) TO 1 STEP -1
  44.   IF MID$(z$, t, 1) = "(" THEN pErrL = pErrL + 1
  45.   IF MID$(z$, t, 1) = ")" THEN pErrR = pErrR + 1
  46.   IF pErrL = 1 AND pErrR = 0 THEN
  47.     PRINT "Fatal Error; last Paren must be a )"
  48.     PRINT "press <ENTER> :";: LINE INPUT nothing$
  49.     CLS: GOTO AnotherExpression
  50.   END IF
  51.  
  52. 'done error trapping;
  53. ' add Paren's to force one pass and contain any ops
  54. z$ = "(" + z$ + ")"
  55.  
  56. RunAgain:
  57. hasP = 0
  58. FOR t = 1 TO LEN(z$)
  59.   IF (MID$(z$, t, 1) = "(") OR (MID$(z$, t, 1) = ")") THEN hasP = 1
  60. IF hasP = 1 THEN GOTO Find_inner_paren:
  61. IF hasP = 0 THEN
  62.   PRINT "done, final value ="; z$
  63.   IF VarFlag > 0 THEN
  64.     VV(VarFlag) = VAL(z$)
  65.   END IF
  66. PRINT "press <ENTER> :";
  67. LINE INPUT nothing$
  68. CLS: GOTO AnotherExpression:
  69.  
  70. Find_inner_paren:
  71.  
  72. Find_left_paren:
  73. FOR t1 = 1 TO LEN(z$) - 1
  74.   IF MID$(z$, t1, 1) = "(" THEN
  75.     GOSUB Find_Right_Paren:
  76.     IF rpFlag <> 0 THEN
  77.       lft$ = LEFT$(z$, t1 - 1)
  78.       rht$ = RIGHT$(z$, LEN(z$) - rpFlag)
  79.       ' PRINT "."; lft$; "."; rht$; ".": END
  80.       GOSUB Eval:
  81.       z$ = lft$ + LTRIM$(STR$(zval)) + rht$
  82.       GOTO RunAgain:
  83.     END IF
  84.   END IF
  85. NEXT t1
  86.  
  87. '--------------------subroutine Find_Right_Paren:-------------
  88. 'driven entirely by Find_Left_Paren:
  89. Find_Right_Paren:
  90. rpFlag = 0
  91. FOR t2 = t1 + 1 TO LEN(z$)
  92.   IF MID$(z$, t2, 1) = "(" THEN
  93.     rpFlag = 0
  94.     RETURN
  95.   END IF
  96.   IF MID$(z$, t2, 1) = ")" THEN
  97.     rpFlag = t2
  98.     RETURN
  99.   END IF
  100. NEXT t2
  101. rpFlag = 0: RETURN
  102. '--------------------END subroutine Find_Right_Paren:----------
  103.  
  104. '------------------subroutine Eval:----------------------------
  105. 'we are always working at the innermost Paren's
  106. 'this routine reduces it to a value one operation at a time
  107. Eval:
  108. z1$ = MID$(z$, t1, t2 - t1 + 1)
  109. EvalAgain:
  110.  
  111. FOR t3 = 1 TO LEN(z1$)
  112.   IF MID$(z1$, t3, 1) = "^" THEN op$ = "^": GOSUB EvalAdd:: GOTO EvalAgain:
  113. NEXT t3
  114.  
  115. FOR t3 = 1 TO LEN(z1$)
  116.   IF MID$(z1$, t3, 1) = "*" THEN op$ = "*": GOSUB EvalAdd:: GOTO EvalAgain:
  117.   IF MID$(z1$, t3, 1) = "/" THEN op$ = "/": GOSUB EvalAdd:: GOTO EvalAgain:
  118. NEXT t3
  119.  
  120. FOR t3 = 1 TO LEN(z1$)
  121.   IF MID$(z1$, t3, 1) = "+" THEN op$ = "+": GOSUB EvalAdd:: GOTO EvalAgain:
  122.   IF MID$(z1$, t3, 1) = "-" THEN op$ = "-": GOSUB EvalAdd:: GOTO EvalAgain:
  123. NEXT t3
  124. GOSUB ReplaceVar:
  125. PRINT "no more ops; value = "; z1$
  126. zval = VAL(MID$(z1$, 2, LEN(z1$) - 2))
  127. '--------------------END subroutine Eval:---------------------
  128.  
  129. '--------------------subroutine EvalAdd:----------------------
  130. 'performs the actual OPeration(s) when called by Eval:
  131. EvalAdd:
  132. FOR t5 = t3 - 1 TO 2 STEP -1
  133.   IF INSTR("^*/+-", MID$(z1$, t5, 1)) <> 0 THEN
  134.     Lend = t5 + 1: GOTO GotLeft:
  135.   END IF
  136. NEXT t5
  137. Lend = 2
  138. GotLeft:
  139. L1$ = MID$(z1$, Lend, t3 - Lend)
  140. FOR t4 = t3 + 1 TO LEN(z1$)
  141.   IF INSTR("^*/+-", MID$(z1$, t4, 1)) <> 0 THEN
  142.     Rend = t4: GOTO GotRite:
  143.   END IF
  144. NEXT t4
  145. Rend = LEN(z1$)
  146. GotRite:
  147. R1$ = MID$(z1$, t3 + 1, Rend - (t3 + 1))
  148. GOSUB ReplaceVars:
  149. PRINT L1$; " "; op$; " "; R1$; " = ";
  150. IF op$ = "+" THEN res$ = LTRIM$(STR$(VAL(L1$) + VAL(R1$)))
  151. IF op$ = "-" THEN res$ = LTRIM$(STR$(VAL(L1$) - VAL(R1$)))
  152. IF op$ = "*" THEN res$ = LTRIM$(STR$(VAL(L1$) * VAL(R1$)))
  153. IF op$ = "/" THEN res$ = LTRIM$(STR$(VAL(L1$) / VAL(R1$)))
  154. IF op$ = "^" THEN res$ = LTRIM$(STR$(VAL(L1$) ^ VAL(R1$)))
  155.  
  156. z1$ = LEFT$(z1$, Lend - 1) + res$ + RIGHT$(z1$, LEN(z1$) - Rend + 1)
  157. PRINT z1$
  158.  
  159. '--------------------END EvalAdd:-----------------------------
  160.  
  161. '--------------subroutine Assign:-----------------------------
  162. 'sets up a variable assignment to the expression
  163. Assign:
  164. VarFlag = 0
  165. Epl = t
  166. NAM$ = LEFT$(z$, Epl - 1)
  167. EXP$ = RIGHT$(z$, LEN(z$) - Epl)
  168.  
  169. namErr = 0
  170. FOR t1 = 1 TO LEN(NAM$) 'legal var names are A-Z, 0-9, a-z, and _ ;cant start with a #
  171.   ch$ = MID$(NAM$, t1, 1)
  172.   IF t1 > 1 AND ch$ >= "0" AND ch$ <= "9" THEN GOTO DuLast: 'cant start with #
  173.   IF ch$ >= "A" AND ch$ <= "Z" THEN GOTO DuLast:
  174.   IF ch$ >= "a" AND ch$ <= "z" THEN GOTO DuLast:
  175.   IF ch$ = "_" THEN GOTO DuLast:
  176.   namErr = namErr + 1
  177.   DuLast:
  178. NEXT t1
  179. IF namErr > 0 THEN
  180.   VarFlag = 0
  181.   PRINT "Fatal Error; illegal variable name"
  182.   PRINT "press <enter> :";
  183.   LINE INPUT nothing$
  184.  
  185. IF NumVars = 0 THEN
  186.   NumVars = NumVars + 1
  187.   VN$(NumVars) = NAM$
  188.   VarFlag = NumVars
  189.   GOTO DuLast2:
  190. IF NumVars > 0 THEN
  191.   FOR t1 = 1 TO NumVars
  192.     IF NAM$ = VN$(t1) THEN
  193.       VarFlag = t1
  194.       GOTO DuLast2:
  195.     END IF
  196.   NEXT t1
  197. 'add new variable
  198. NumVars = NumVars + 1
  199. VN$(NumVars) = NAM$
  200. VarFlag = NumVars
  201. DuLast2:
  202. '------------------END subroutine Assign:----------------------
  203.  
  204.  
  205. '--------------subroutine ReplaceVars:-------------------------
  206. 'checks for operands being variables
  207. ReplaceVars:
  208. FOR t9 = 1 TO NumVars
  209.   IF VN$(t9) = L1$ THEN L1$ = LTRIM$(STR$(VV(t9)))
  210.   IF VN$(t9) = R1$ THEN R1$ = LTRIM$(STR$(VV(t9)))
  211. NEXT t9
  212. '-----------------END subroutine ReplaceVars:------------------
  213.  
  214.  
  215. '----------------subroutine ReplaceVar:------------------------
  216. 'catches case of a variable not being an operand
  217. ReplaceVar:
  218. chNam$ = MID$(z1$, 2, LEN(z1$) - 2)
  219. FOR t9 = 1 TO NumVars
  220.   IF VN$(t9) = chNam$ THEN z1$ = "(" + LTRIM$(STR$(VV(t9))) + ")"
  221. NEXT t9
  222. '-------------------END subroutine ReplaceVar:-----------------
  223.  
  224.  
« Last Edit: November 07, 2021, 10:28:22 pm by Colonel_Panic »

Offline Colonel_Panic

  • Newbie
  • Posts: 54
    • View Profile
Re: Language
« Reply #1 on: November 07, 2021, 11:04:54 pm »
it is *supposed* to do:

addition, subtraction, multiplication, division, exponent

if you peek at the code around line 120+ you will see where "any operation"
between 2 values, the operand could easily be inserted and the result calculated.
fairly easy to add math operations one at a time to get your library going.
I always stayed pretty "lean" and didnt ask it to do much beyond reduce algebraic.

What I do, is I check a string... and if it starts with a VARIABLE followed by an equals sign,
 then this module is a go.
If I am doing ARRAYS? I will want more than straight integer numbers, the end user
 of my software will expect to have algebraic equations for array indexes, like any programmer
 needs. This module?

well... its a STRING, and its surrounded by PARENTHESIS... the module automatically spits back the
 array index. If its a integer index, fine. if its a variable index, thats fine too. If the index of the array
 reference is an algebraic equation of existing variable assignments? Hey, it spits back the result.

if the STRING isnt a variable name followed by an equals sign?
Then its probably a COMMAND, and I would then search a list of commands in a string array.
take appropriate action.

NOTE: this is not "the actual code" I used twice before; I recreated it because I have done it a
  couple times before. If you can "trip it up" and prove it makes a parenthetical or order of operations error? That's good work on your part.
« Last Edit: November 07, 2021, 11:10:26 pm by Colonel_Panic »

Offline Ed Davis

  • Newbie
  • Posts: 40
    • View Profile
Re: Language
« Reply #2 on: November 09, 2021, 06:22:40 am »
it is *supposed* to do:

addition, subtraction, multiplication, division, exponent

...

NOTE: this is not "the actual code" I used twice before; I recreated it because I have done it a
  couple times before. If you can "trip it up" and prove it makes a parenthetical or order of operations error? That's good work on your part.

Pretty cool!

I did notice one problem - it gets:


Code: QB64: [Select]
  1. -2^-3^-4
  wrong.  For instance, in QB64, the answer is:



(https://www.qb64.org/forum/data:image/png;base64,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)


However, in the posted code, the above loops:


(https://www.qb64.org/forum/data:image/png;base64,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)




The QB64 IDE also gets it wrong too, so you're in good company!




(https://www.qb64.org/forum/data:image/png;base64,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84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQYASYmy8MwAAMwEAAAwhwQNK5ecbfPNkD9gAGYCCaAQQYAebmCwMwAAMwEMAAAhyQ9OhbF/Nz84cBGICBeAYQ4KMCnPPBFzmAARiAARhYNwNNnuDIRw9XXp2aib60+CPxZn7r0popOXwwAAMwAAPrZAABdheCdSab2BzmuTPQNE3KX3adJZvtr9V9nOynWKW+Whxrt+N93fqtWrexV41VGz82B7V42Lfv+YIAI8BHHrYc4u07xFPumRce3+47l8aV/Nv6Sv7e5sf7tvcf215X3LyedcYe+/0ybvNnHwFGgBFgfu5/yICEoVQOeUBrfGlMW1/J39tK47PN+63aLs2zakyNX2dszUG5eUEdmnMEGAGe/ME1FEL85/OgkDCUSu2T75M9l75P7ZKP9bf9XXUbM9e9v+0vzaF+lX682qV+b/NtO1+fvr4+pTVpbC7VTzmfs9RnLxBgBJjDyxvwIQN6qOeHhx7s1uYfKrW+ml1xbb+t+/iltvxVeh9v923rP7TP+/u2jZ3rtf4hdu+rdi7b5vBroT0/cUaAWwTYgk794JdzyMN256HrIaz9tX7eprYtrX+uq8/bS31tvl3j81jv4+PV2rKXYpTWWbIphl2DbLa0/aU46tcYtUu+3se37Vhfly/lTM7xwQabvws70V9Byn/1SJu/rX8NSZDq+6Cc3w2SPZl2T0rMW5ut59z7tvajZi+NafNVPFt2+ft+27b10lq65uka39Wv+N6vze59fVtjKac9C5vIJ2/APd6AN7ERzLF9h2cX96z0cLc2W8/fv28rJzV7aUybr+LZsuSfbfLx/bZt66W1KEatr2t8V7/ie782u/f1bY2l3L5nCAKMAB8+uDjA23eAp96z0sPd2mw9z+3bWo+123ppjO9XjFrp/X3bzuH7utp2Tu9r48rP+3S1S+PsGFsv+ZbWID/K7Tu/CDACjADzS1iHDAwRgOzbJgiKJT/rW7L1ERAb09f9ePXX7FpDyU82lTaGbLnMdrXlo3atv+ZXsitWrU92yu0T37xnCDACfPjw5RBv5yFm39g3GNhOBhBgBBgB5g0YBmAABgIYQIARYA5ewMHjjWU731jYN/ZtSgYQYAQYAUaAYQAGYCCAAQQYAebgBRy8KW/RxOKtDAa2kwEEGAFGgBFgGIABGAhgAAFGgDl4AQePN5btfGNh39i3KRlAgBFgBBgBhgEYgIEABhBgBJiDF3DwprxFE4u3MhjYTgYQYAQYAUaAYQAGYCCAAQQYAebgBRw83li2842FfWPfpmQAAUaAEeCZCrD+HWDKmfzfrQ3rgMWJGchq3lgR4v8DPhQkwTbljYdY3KD7MgB/sNKXFfy2kxXegO3lo7nsUHwz0DwAtxPqXXkYwR/87QrLfB9llhFgBPjIpYODUj4oEXlBgOezFxH7z5y7v/8IMAKMAM/8Z8A8iHf/Qcwe7+ceI8AIMAKMAMPATBlAmHdbmBFgBJiH70wfvnwEvdsPX8SV/UWAEWAEGAGGgZkygEjvtkgjwAgwD9+ZPnx5A97thy/iyv4iwAgwArxDAizRnqLMAjFFnFqMdcRH1BC1bWIAAUaAEWAE+JjQ2odYTUBXsa8rvo1LHTGeOwMI8MQC3PZQGgpDjjV0DP79Hzraq7nmbMz6NKatLH2/1l/92Wbr1qetrjG2tP6yj41fi2XjaQ7K/ueBXG0+VwjwxAKcIdYDQkD7tuxt5ZgxbfHoO3645p7jMevTmFopDmy/tdm6fEo29fmy5Gtttq6xJZv62kqNy6X8rI36cebJybxyggBvQID1gBgCPw+UeR2UIXsn31X3cMx4jRlS+vUOGdvHdx3xFVOl1qE25fafn33YQwR4zQKcHwwWJPugUN36WJutl2KU+mXL/qrn0o7vqttxqmuMb9t5anU7vx2vuu23MdbV7+fIbftl51Vd/batei7Vb0v1W9uQ+pjxGtO31Hr6+o/xm3oOG8/W89rUpjzKNPmYZz4Q4DUKsB5WHn5v9+3sX7LV7N5X7VzWxvg1qa2xapfGWx9b1xhvq7Wz3cf3vlP3a40+ruxd85fGlcYo3irlmLga06fU2vr4DvVRbJVDx9f8fbxaW3bKeQoP+3KwLwjwGgU4Q5YfJB42PVxk922NaxurMbasxZOP+ttK+ZZKO872W3uuq0/2IW35lspaPNlVaqzatbLk18fmfXy7Nt9Q+9RxFS+XWou19alrXKmsjZdvrd/a5Vsqs1/JLltXv/woEeW5MIAAr1mASxutB476fDvbS7Y2u2L19bH+tl6b1/rYObJ/rU92H9O35WfjWluprhil+W2cWr/1sfEVt83mfXzbjl2lPiauxrSVWlObz5R965zPx1abEpHdBgYQ4A0JcH6gCQg93GrtbPc+bb7qU1kbq/62su9Y+eXSx1Of7F1t+eXS+9q+Ur3Lv62/1NfH5n18W+us2dXfVY4ZrzG1UnPW+tdhX+ecPrbalAjwNjCAAG9AgPVQExBd7exnfWr1IfHk21XaueTrbbZt6338s09pTG2s9y+NtTZbb4vp47b5+phd7bZY6utT+nmGjNFYXyqGtZdstn9IvRSrZBsSs83Xx1abEgHeBgYQ4IkFeMzDQmM8MLLn0vZZu+rqV1ul7ENKjbWlxsumdi69TW1byt/acl12W3of77dqv12zYo2ZX2NKMdS3SjkmrsbUyrb11MYMtZfmGBqjj7+fJ4/xNtoI8ZwZQIAnFuA5b/am1qaH56bm29V5xuRRY/a13FUW+L528yKBACPAk7816OHPQ2O1h8aYPGrMvpYwtxpz5G+z+UOAEeBJBdg/+DnQ4w+0cjkkhxpD2Rz+aMTmYkgu8R3PLrnrlzsEGAGeVIA5eP0OXp88STj6+MpHY/a1VB4op+OQXK4vlwgwAowAu3+Kci4PHInoXNbDOtb3ICa3+5lbBBgBRoARYBiYKQMI824LMwKMAPPwnenDlzfg3X74Iq7sLwKMACPACDAMzJQBRHq3RRoBRoB5+M704csb8G4/fBFX9hcBRoARYAQYBmbKACK92yKNACPAPHxn+vDlDXi3H76IK/uLACPACPDMBVhCTFn+xzXIC3nZWgbyLayxInTl1amZ6Es3vCPx7FwzrGvNB3k5ANvaqHNrhQEYgAEYmIIB3oDdJcAmVbcqa6POwYMBGIABGJiCAQQYAeYj6Jl+BD3FAScGQgED82UAAUaAEWAEGAZgAAYCGECAEWAOXsDB461kvm8l7A17sykGEGAEGAFGgGEABmAggAEEGAHm4AUcvE3dsJmHtzkYmC8DCDACjAAjwDAAAzAQwAACjABz8AIOHm8l830rYW/Ym00xgAAjwAgwAgwDMAADAQwgwAgwBy/g4G3qhs08vM3BwHwZQIARYAQYAYYBGICBAAYQYASYgxdw8Hgrme9bCXvD3myKAQQYAUaAEWAYgAEYCGAAAUaAOXgBB29TN2zm4W0OBubLAAMEFSgAAAatSURBVAKMACPACDAMwAAMBDCAACPAHLyAg8dbyXzfStgb9mZTDCDACDACjADDAAzAQAADCDACzMELOHibumEzD29zMDBfBhBgBBgBRoBhAAZgIIABBBgB5uAFHDzeSub7VsLesDebYgABRoARYAQYBmAABgIYQIARYA5ewMHb1A2beXibg4H5MoAAI8AIMAIMAzAAAwEMIMAIMAcv4ODxVjLftxL2hr3ZFAMIMAKMACPAMAADMBDAAAKMAHPwBh68pmmS/9KN2dq9TW1K3rC6GLAc5XqX/6b77fo2PfcuzYcAI8CzO9ybPmDpzJ8+8+rBY329rattx5bqQ9ZTGo9tXgLveejaH+/v213jN9U/dl1jx23q+9rkPAgwArzXAjxU7EoPD2/ravc54EPX1ScmPpsXZs9C1x7U/LO9a+ym+2tr7bOOVcb2ib8tPggwAjy7g72pwzNG5EoPDm+zbVsf+n2NWd/QOfBfnyiP2fs+Y+Sj0u6htamey5LP2H7F0ni1h5arjh863xz9EWAE+MjhnCOk61jTWHErPTS8TW2Vq6x/7DpXmZOxq4vy2L0fOq7k7222bevaZ2uz9VK/bLks+dr+PvUpYvSZZ64+CDACvHcCvIqolR4Y3qa2ylUP/yrrXXVuxg8X41X2vc9Y+djS7pPsstm2ravfluovldYv1+Xj7UPbU8UZOu8c/BFgBHjvBDgfPP0ZeghLDwtvs21bHzrXKuscMxdjhottLWdj971rnO/37bweb7NtWy+tvavfjhnia8fZ+hQxbLxtqyPACPBeCnA+qPoz5NCWHhje1tXuO9+Y9fWNjd90YlvLpeeg5mfttTHZnv18v293+ZT8+8xvfVTviiW/Wrnq+FrcbbIjwAjw3gpwPqj60/fQlh4a3tbV7jPX0HX1iYnP+kXX59iz4PtLbT/Gtm09j/Xtks362LrmtjZbL/XLVprH9nXVS/N0jdnFfgQYAd5rAc6HWn/6HnA9PGypsW02+XSVQ9fTFY/+zQuvzbmYsLauusaotP6y5TLb1ZZP37b8FMePr/XbOeWjsX3KMWP6xN1GHwQYAd57Ad7Gg8uaY0WV/JP/KRhAgBFgBHjgP0U5xcEjBg9wGIABBBgBRoARYBiAARgIYAABRoA5eAEHj7cf3n5gAAYQYAQYAUaAYQAGYCCAAQQYAebgBRw83n54+4EBGECAEWAEGAGGARiAgQAGEGAEmIMXcPB4++HtBwZgAAFGgBFgBBgGYAAGAhhAgBFgDl7AwePth7cfGIABBBgBRoARYBiAARgIYAAB7iHA+rdLKZvDf3eWXJALGIABGFiRgfwxSGNF6MqrUzPRlz5iORLPzjXDutZMycdDMAADMAAD62SAN2B3CVhnsonNYYYBGIABGBADCDACzM9+An72owNIycMYBvaXAQQYAUaAEWAYgAEYCGAAAUaAOXgBB4+3nv1962Hv2XsxgAAjwAgwAgwDMAADAQwgwAgwBy/g4OkGTMnbEAzsLwMIMAKMACPAMAADMBDAAALsBPjI34ke1bfiX8xuGM9f7ocBGICBvWAgf/xxRHQm+kc48j++oY9Wtukf4jiSCwSYf/mKCxEMwAAMrIsBBPiyoxeQUaJrY3Bz3Yub67oOJHF52MPA/jCAAFvxnKKOACPAMAADMAADPRhAgKcQXRujR9K54e7PDZe9Zq9hAAZqDCDAVjynqCPA3HxhAAZgAAZ6MIAATyG6NkaPpNduQ9i5KcMADMDA/jCAAFvxnKKOAHPzhQEYgAEY6MEAAjyF6NoYPZLODXd/brjsNXsNAzBQYwABtuI5RR0B5uYLAzAAAzDQgwEEeArRtTF6JL12G8LOTRkGYAAG9ocBBNiK5xR1BJibLwzAAAzAQA8GEOApRNfG6JF0brj7c8Nlr9lrGICBGgMIsBXPKeoIMDdfGIABGICBHgwgwFOIro3RI+m12xB2bsowAAMwsD8MIMBWPKeoI8DcfGEABmAABnowgABPIbrEWP2/cSSH5BAGYGDPGECA92zDV/7vFskXD0kYgAEYmIQBBBiQJgEJYZ/4/5WGS7iEgZ1nAAEG8p2HnMsBlwMYgIE5MoAAI8AIMAzAAAzAQAADCHBA0ud4E2NNvCHAAAzAwGYZQIARYG6+MAADMAADAQwgwAFJ55a52Vsm+SbfMAADc2QAAUaAufnCAAzAAAwEMIAAByR9jjcx1sQbAgzAAAxslgEEGAHm5gsDMAADMBDAAAIckHRumZu9ZZJv8g0DMDBHBhBgBJibLwzAAAzAwOYZ+H+BYDXJRG2UUAAAAABJRU5ErkJggg==)


(https://www.qb64.org/forum/data:image/png;base64,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)



Hmmm.  Not sure why the pictures pasted from the clipboard didn't come through.  They looked fine on this end :(

Anyway, the answer from QB64 is:  -0.9914792

However, the IDE Math Tool gets 4096, and the posted code just loops.

Again, very cool, and thanks for sharing!

« Last Edit: November 09, 2021, 06:32:59 am by Ed Davis »

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #3 on: November 09, 2021, 06:32:05 am »
-2^-3^-4

With the images goofed up, I can't see what the results were, but I'd suspect your expectations are wrong.

-2^-3^-4...  I'm expecting you think that's a NEGATIVE 2 there, don't you?

How about if I write it as:  0 - 2 ^ -3 ^ -4

Now, isn't that a MINUS in front of that 2?

By order of precedence, we do powers before subtraction, so that minus is evaluated last.  I'm guessing what you want is (-2) ^ -3 ^ -4 for your answer.
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

Offline Ed Davis

  • Newbie
  • Posts: 40
    • View Profile
Re: Language
« Reply #4 on: November 09, 2021, 06:53:47 am »
-2^-3^-4

With the images goofed up, I can't see what the results were, but I'd suspect your expectations are wrong.

-2^-3^-4...  I'm expecting you think that's a NEGATIVE 2 there, don't you?

How about if I write it as:  0 - 2 ^ -3 ^ -4

Now, isn't that a MINUS in front of that 2?

By order of precedence, we do powers before subtraction, so that minus is evaluated last.  I'm guessing what you want is (-2) ^ -3 ^ -4 for your answer.

I was simply testing it.

In the QB64 IDE running:

print -2^-3^-4

Shows:  -.9914792

Are you saying that is wrong?

The IDE math tool gives 4096.

Google calculator returns:

-0.99147913749

I think QB64, google calc (and various other eval/calc programs) are correct, and the IDE math tool is wrong.

« Last Edit: November 09, 2021, 06:59:34 am by Ed Davis »

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #5 on: November 09, 2021, 06:59:33 am »
I don't "want" anything :)

I was simply testing it.

In the QB64 IDE running:

print -2^-3^-4

Shows:  -.9914792

Are you saying that is wrong?

And the math tool gives 4096.

The google calculator returns:

-0.99147913749

I think QB64, google calc (and various other eval/calc programs) are correct, and the IDE math tool is wrong.

Of the math tool is showing 4096, it's definitely wrong.  I'll dig into it when I get some freetime (which might be after the holidays).  Thanks for reporting the issue -- the math tool is the same math which CONST uses to calculate values, so if it's wrong, CONST probably would be as well.
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

Offline david_uwi

  • Newbie
  • Posts: 71
    • View Profile
Re: Language
« Reply #6 on: November 09, 2021, 07:35:54 am »
-2^-3^-4 evaluating left to right...
-2^-3=(1/-2)^3=-1/8
(-1/8)^-4=-8^4=4096

FellippeHeitor

  • Guest
Re: Language
« Reply #7 on: November 09, 2021, 07:47:52 am »
@SMcNeill We have been discussing for a while now on Discord to replace the custom math interpreter entirely and make CONSTs "fake consts" - that is - have them be regular variables, have QB64 evaluate them at runtime, not at compile time, and just set a "don't change" flag so they are treated as consts. There's a lot to figure - scope, for instance, but that's the trending idea in the dev lounge right now.

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #8 on: November 09, 2021, 08:23:48 am »
-2^-3^-4 evaluating left to right...
-2^-3=(1/-2)^3=-1/8
(-1/8)^-4=-8^4=4096

Even this is wrong...   That -2 in front of the 2 should be processed last as a minus sign.

Guys, run this little demo and you'll see that the math evaluator is all messed in -- in ALL cases in QB64 -- for this type of math problem:

Code: QB64: [Select]
  1. Screen _NewImage(1024, 720, 32)
  2.  
  3. Print "Let's establish what happens when we have a minus number raised to a power: -2 ^ 2 = "; -2 ^ 2
  4. Print "Order of Operations says we solve powers over subtraction, so we get -4, not 4."
  5. Print "So let's solve the equation for -2 ^ -3 ^ -4 with that in mind:"
  6. x = 2 ^ -3
  7. y = x ^ -4
  8.  
  9. Print "- 2 ^ -3 ^ -4"
  10. Print "-"; x; " ^ -4"
  11. Print "-"; y
  12.  
  13. Print "The true solution *should* be -4096 and not +4096."
  14. Print "Somewhere along the way processing, that minus changes from minus to negative and then gets powered out to a positive..."
  15. Print "Which, it really shouldn't do..."
  16. Print "But a +4096 is much more reliable of an answer than "; -2 ^ -3 ^ -4
  17. Print "How the heck do we get that anyway??"
  18.  
  19. Print "Another way to do this problem is by multiplying powers:"
  20. Print "For example:   x ^ y ^ z is the same as x ^ (y * z)"
  21. Print "(From Power of a Power Property of Exponent)"
  22. Print "So in this case, we get -2 ^ -3 ^ -4 as being the exact same as -2 ^ (-3 * -4) = -2 ^ 12."
  23. Print "And, if we solve it like before, we get:"; -2 ^ 12
  24. Print "If we count that - in front of the two as a minus, the result is -4096."
  25. Print "If it's a negation symbol, the answer is +4096."
  26. Print "Either way, it shouldn't be "; -2 ^ -3 ^ -4
  27.  

The math evaluator is *almost* right, but it swaps that minus over to a negative at some point and loses track of it.

-2 ^ -3 - ^ -4 is the same as -2 ^ (-3 * -4), or -2 ^ 12 -- and that answer is -4096.
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #9 on: November 09, 2021, 08:38:42 am »
@SMcNeill We have been discussing for a while now on Discord to replace the custom math interpreter entirely and make CONSTs "fake consts" - that is - have them be regular variables, have QB64 evaluate them at runtime, not at compile time, and just set a "don't change" flag so they are treated as consts. There's a lot to figure - scope, for instance, but that's the trending idea in the dev lounge right now.

It'd kind of defeat the purpose of CONST, but it wouldn't upset me any.  All these edge cases in math are crazy, but in this case QB64's normal evaluation methods are terribly crazy. 

The only way to get the 0.9 result is if we count the negation in ^ -3 as a minus:
x = 3 ^ -4
y = -2 ^ -x
Print y

With that a minus 3, rather than a negative 3, we'd do our power first, like above.

It's all goofed up!  :P

Honestly, if it's evaluating as I think it is, I'd expect it to error out on us just from trying to work two math operations without any value between them -- the minus and the power. 

You can't divide divide //
You can't multiply multiply **
Why can you exponent subtract ^-

That should be an exponent negation, not an exponent subtraction in there. 
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #10 on: November 09, 2021, 09:03:40 am »
@BSpinoza  -- The problem is with how you deal with that leading minus.

In example 2, you count it as (-2 ^ -3), setting the result as a negative value you then deal with.

After that, however, you keep the two separate: PRINT -2 ^ (-3 ^ -4)

Try a simple:  PRINT -2 ^ 2.   The answer is -4, not +4, as that minus comes after the exponents are finished.  Your second example should be -(2 ^ -3) ^ -4), if we're going to stick to the same order as we do with -2 ^ 2.

It's all goofy.  Or, if it isn't, I need a *LOT* more coffee to understand why we're gettingthe results we are.

PRINT (-2) ^ (-3 ^ -4) ends up giving as a positive number, instead of a negative, after all.
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #11 on: November 09, 2021, 09:18:40 am »
What we're doing is - (2 ^ - (3 ^ - (4)))...  Powers over negation.  None of those are negative numbers; they're all evaluated as negation operations.

Anyone who doesn't use parentheses for these type of formulas are just crazy.
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!

FellippeHeitor

  • Guest
Re: Language
« Reply #12 on: November 09, 2021, 09:26:33 am »
To be very honest with you all, all that matters to me is that this:

 
Captura de Tela 2021-11-09 às 11.24.54.png


Results in the same as this:

 
Captura de Tela 2021-11-09 às 11.23.45.png
 
Captura de Tela 2021-11-09 às 11.24.05.png

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Language
« Reply #13 on: November 09, 2021, 11:06:12 am »
+1 with Fellippe and BSpinoza.

Very interesting problem and BSinoza explained issue that Power is like Division not Communitive.

BTW Oh Interpreter would make you say p[-2,p[-3,-4]] or p[p[-2,-3],-4] ie forcing to pick which is to be done 1st and 2nd. * Gold Star for it ;-))
Update: well it did this for one:
Quote
p{p{-2,-3},-4} = 4096

and for the other it called an error,
 
oh test -2^-3^-4.PNG

It's saying the answer is a complex number!


A expression with a leading minus (separated from number by space) should force an error IMHO, or the minus is assumed to reverse(+/-) the number value immediately to the right like - -2 = 2 or - 2 = -2.
« Last Edit: November 09, 2021, 11:29:02 am by bplus »

Offline SMcNeill

  • QB64 Developer
  • Forum Resident
  • Posts: 3972
    • View Profile
    • Steve’s QB64 Archive Forum
Re: Language
« Reply #14 on: November 09, 2021, 11:37:03 am »
@bplus -- you must've missed this:

What we're doing is - (2 ^ - (3 ^ - (4)))...  Powers over negation.  None of those are negative numbers; they're all evaluated as negation operations.

For proof, try this little code:

Code: QB64: [Select]
  1. Print -(2 ^ -(3 ^ -(4)))
  2. Print -2 ^ -3 ^ -4

And for the love of God, can somebody explain why the BEEP PRINT is printing different levels of precision here?  I thought we printed to SINGLE precision by default.  How does adding a parenthesis suddenly give us DOUBLE precision? 

EDIT:

When using powers of powers, you multiply the exponents together.

https://www.mtsac.edu/marcs/worksheet/general_topics/11properties_exponents.pdf#:~:text=not%20present%20%20%20Properties%20%20%20,%20%18%13%01%0E%17%08%14%20%20%203%20more%20rows%20

 
SS.png


Since we solve left to right,

x^2^3 is the same as (x^2) ^ 3, which makes the answer x ^ 6.

In this case, if those are negative numbers, it'd be:
-2 ^ - 3 ^ -4
- 2 ^ 12
4096

But QB64 doesn't count ANY of those as negative numbers.  Instead, it counts them as negation operators.  (ie X = -X)

negate (2 ^ negate (3 ^ negate (4)))
« Last Edit: November 09, 2021, 11:46:35 am by SMcNeill »
https://github.com/SteveMcNeill/Steve64 — A github collection of all things Steve!