Hello, and welcome to the fifth part of the ST User Runtime magazine Basic
Tutorials. This month, Johnny Johnson continues exploring variables.
                    FIRST STEPS IN BASIC
     Last month we saw how variables can be used to hold information. Our
simple programs introduced the concept of storing user input in a variable and
then working with that number.
     BASIC languages on the ST generally allow two types of variable to be
used. Integer variables can contain only whole numbers like 3 or 5 but not 3.5.
The second is a real number, which can contain both an integer part (a whole
number) and a fractional part. 3.14, the common expression of the value of pi,
is a real number.
 The integer variable is the most widely used type of variable in
programming. Because they contain no fractional part, they are fast and easy to
work with. The result of a calculation using integer variables will always
report a whole number (unless it is a division, in which case the result may be
truncated or rounded).
     Real numbers are used only where absolute precision is needed. Computers
can only work with binary integers, ones and zeros, so the conversion from real
numbers must be made by software. It stands to reason that this conversion must
take time, thus slowing down the overall speed of the operation.
     Before we go any further, its time to review a little basic maths. One of
the first things we all learned in maths class was how to round decimal numbers
up or down.BASIC uses rounding quite a lot, so it's important we know what
BASIC is doing when it rounds numbers. Here are the basic rules for rounding
     LESS THAN .5          =          ROUND DOWN
     EQUAL TO .5          =          ROUND UP
     Remember that rounding removes the decimal part of a real number and then
adjusts the integer part accordingly. Here are a few quick examples:
     5.4      =     5     (The number is rounded down)
     6.6     =     7     (The number is rounded up)
     9.5     =     10     (The number is rounded up)
     4.4     =     4     (The number is rounded down)
     For a bit of practice on your own, try converting these real numbers into
integers to make sure you can remember how rounding works. The answers are
given at the end of this article:
     5.5     12.3     1.6     5.4     9.3     6.8
     BASIC languages on the ST have two ways of defining an integer variable.
The first, and simplest, is just to use the percentage sign after the variable
letter, like this:
     A% = 2
     However, if you want to define a range of integer variables, BASIC
provides the DEFINT command to help you.
     10     DEFINT A -D
     This command will then define any variable that begins with the letters A
to D inclusive as being integer variables. DEFINT is not case sensitive, so
variables beginning a to d would also be included. DEFINT can only be used
inside a program, and should be one of the first commands you use in any
program that uses variables. (See the section on declaring variables in last
months column).
     Integer arithmetic is the simplest form of maths your ST can perform, but
there can be problems if you attempt to mix integer and real numbers in the
same calculation. To illustrate the problem, try these two programs.
     10      A% = 2
     20     B = 2
     30     PRINT A% + B
     As you would expect, the answer comes out as 4. Now try the
following program:
     10     A% = 2.5
     20     B = 2.5
     30      PRINT A% + B
     BASIC prints the answer 5.5, which is obviously wrong. The question is,
why has BASIC arrived at this answer?
     To understand why the answer was 5.5 and not the 6 we expected, you have
to remember what the % sign does. BASIC is treating variable A as an integer
variable, and so it is following the rules for rounding numbers and rounding A%
up to the nearest whole number, in this case 2.5 becomes 3. So the sum BASIC
performs is in fact 3 + 2.5 which does equal 5.5.
     This sort of rounding operation is also cumulative. If the result of this
sum were also used as an integer variable, like this:
     10     A% = 2.5
     20     B = 2.5
     30      C% = A% + B
     40      PRINT C%
     The integer C% would be rounded from 5.5 to 6, the nearest whole number.
As you can see from these examples, it is very important to know how BASIC will
treat numbers. This sort of cumulative error in calculations could mean that
the results from a program are completely wrong. The golden rule is never
attempt to mix real and integer variables.
     Incidentally, if you use DEFINT to define a range of integer variables,
say from A to F and then decide you want to use the variable B as a real number
and not an integer, you can override the DEFINT statement by using the
exclamation mark (!) with the variable in the same way as a percent sign, like
     B! = 2.9
     Normally the DEFINT statement would try to force this variable to be an
integer, and would round the number up to 3. The exclamation mark informs BASIC
to let the 2.9 stand as a real number.
     As if to confuse matters even further, BASIC provides two more statements
for dealing with real numbers. The first, INT, slices off the fractional part
of a real number, leaving only the whole integer. Try this program to see how
INT works:
     10     A = 2.9
     20     B% = A
     30      PRINT "VALUE = ";A
     40      PRINT "ROUNDED = ";B%
     50     PRINT "TRUNCATED = ";INT(A)
     This program will print the following results:
     VALUE = 2.9
     ROUNDED = 3
     TRUNCATED = 2
     We've already seen how the % sign will force a number to be rounded up or
down, depending of the value of the fraction part. The INT statement truncates
the number, completely ignoring the fractional part and just printing the
whole, or integer part of the original number.
     The second statement is called CINT and it does the opposite of INT. It
works like the % sign, and rounds the number up or down, depending on the size
of the fractional part.
     10     A = 2.9
     20      PRINT "VALUE = ";A
     30      PRINT "ROUNDED = ";CINT(A)
     40     PRINT "TRUNCATED = ";INT(A)
     This program will print the following results:
     VALUE = 2.9
     ROUNDED = 3
     TRUNCATED = 2
     These results are exactly the same as for Program Four, but they are
achieved in one line less code. The shorter program involves less stages, and
so it is more efficient when run. Because the variable B% is not used, it
remains available for other purposes, which could be useful if you were writing
a long program that used a lot of variables.
     Before the next article, try writing a program that rounds and truncates
variables. Experiment with converting real numbers into integer numbers in a
program, just to see how cumulative error can affect the results of
mathematical operations.
     Next month we'll be taking what we've learned here one stage further and
working with strings, so remember to get next month's User.
     (Incidentally, remember the little bit of practice on rounding real
numbers I set earlier? Well, for those of you who were wondering, here are the
correct answers:
     6     12     2     5     9     7
     I hope you all managed those all right. If you didn't, go back and review
the section on rounding numbers again.)


(C) Marko, Suomen Atari-sivut / ArkiSTo 2003