m (Minor cleanup such as: remove unnecessary text already stated)
m (Editing Scratch: - Fixed the blockspec for the edited version)
Line 67: Line 67:
 
{{see also|Blockmaking FAQs}}
 
{{see also|Blockmaking FAQs}}
  
Scratch can be [[Scratch Modification|modified]] to add a [[Blocks|block]] which solves exponents. This is simplest to do in [[Scratch 1.x|Scratch 1.4 and previous versions]]. The block specification is:
+
Scratch can be [[Scratch Modification|modified]] to add a [[Blocks|block]] which solves exponents. This is simplest to do in [[Scratch  
 +
1.x|Scratch 1.4 and previous versions]]. The block specification is:
  
<syntaxhighlight lang="squeak">('%n ^ %n' r exp:of: - -)</syntaxhighlight>
+
<syntaxhighlight lang="squeak">
 +
('%n ^ %n' #r #exp:of: #- #-)
 +
</syntaxhighlight>
  
 
and the method is:
 
and the method is:

Revision as of 03:22, 17 February 2020

Solving exponents is the process of multiplying a number (the base) by itself a number (the power) of times. For example:

23 = 2 * 2 * 2 = 8

Many Scratchers have requested a block for calculating exponents,[1] but such a block does not yet exist.

Methods for Calculating Exponents in Scratch

There are multiple workarounds for solving exponents in Scratch.

Repeat Method

Note Note: This method can only be used with whole number powers
when flag clicked
ask [What is the base number?] and wait
set [1st# v] to (answer)
ask [To what power?] and wait
set [2nd# v] to (answer)
set [ans v] to (1)
repeat ([abs v] of (2nd#))
set [ans v] to ((ans) * (1st#))
end
if <(2nd#) < [0]> then
set [ans v] to ((1) / (ans)) // a quick workaround for negative powers
end
say (join [The answer is: ] (ans)) for (2) secs

How it Works

  • The Variable "1st#" is the base number. This is the number that will be multiplied by.
  • The Variable "2nd#" determines how many times to repeat the multiplication.
  • The variable "ans" is the answer, which is the number 1 multiplied by "1st#", "2nd#" times.

Logarithmic Method

The logarithm method is much faster than the repeat method, but can not be used with negative bases.

(round ([10 ^ v] of ((power) * ([log v] of ([abs v] of (base))))))

or

(round ([e ^ v] of ((power) * ([ln v] of ([abs v] of (base))))))

How it Works

  • The variable "base" is the base and the variable "power" is the power, or the number of times the base is multiplied. The reported value is the answer.
  • The math works because n * log m = log mn and 10log mn = mn.

Special Cases

These are some cases that the above method will fail to calculate correctly:

  • The base is 0: Since log 0 is undefined, have an if-else that gives 0 for the answer if the base is 0, as long as the power is positive. The answer 1 should be given for 00 so that it does not give an error then.
  • The base is negative: If one wants to be able to do something such as xp where p is an integer, and they want to allow x to be negative, then the solution with logarithms will not work, because log(-1) is undefined (there is no solution to 10x = -1). Ways to solve this are:
    • Use the loop multiplication method, and even just use loop multiplication / division whenever the power is an integer.
    • Factor out the negative and find the answer for the absolute value of the exponent, then divide 1 by it if the exponent is negative. Also, it's a good idea to use an if block for whether p is odd or even ( if p mod 2 = 0 then p is even).
set [result v] to ([abs v] of (base)) // used to spread out math over two lines
set [result v] to ([e^ v] of ((power)*([ln v] of (result)))::operators)
if<(base) < [0]> then
set [result v] to ((1) / (result))
end
Note Note: Positive rational exponents, e.g. 10½ do work. Thus, this can be used to find N-roots of numbers.

Editing Scratch

Archive.png This article or section documents something not included in the current version of Scratch (3.0). It is only useful from a historical perspective.
See also: Blockmaking FAQs


Scratch can be modified to add a block which solves exponents. This is simplest to do in [[Scratch 1.x|Scratch 1.4 and previous versions]]. The block specification is:

('%n ^ %n' #r #exp:of: #- #-)

and the method is:

exp: b of: n
	^ b raisedTo: n

References

  1. http://scratch.mit.edu/discuss/topic/15646/