FUNCTION:  IsASquare().  This function takes an integer as its argument.  If its argument is a perfect square (that is, its square root has no decimal part), it returns TRUE (-1), otherwise it returns FALSE (0).

The integer can be any of the usual IBasic types, as shown below:


Exponent of 2

int 230 1073741824
uint 231 2147483648
int64 261 2305843009213693952
uint64 262 4611686018427387904

Declaring the function must be done like this:

declare IsASquare(r: int) (or whatever type of integer you choose).

Here's the code:

sub IsASquare(s)
' if arugument s is a perfect square
' returns TRUE (-1), otherwise
' returns FALSE (0)
def root: float
root = sqrt(s)
if root = int(root)
    return -1
    return 0

Variable root is created to hold the square root of the function's argument, s.  Now, s is actually an integer, so taking its square root in the usual way would result in another integer. 

For instance, if the code says something like "s = sqrt(s)" for a value of, say, 50, s would end up as 7, instead of the correct value of 7.0711.  Seeing an integer result of taking the square root appears to indicate that 50 is a perfect square!

To avoid this error, root is data type float - that is, decimal points are permitted.

root = sqrt(s).  This line takes the square root of argument s and stores it in variabe root. Any decimal points resulting are retained.

if root = int(root).  This line can be paraphrased as "if the square root of s is equal in value to the square root of s with its decimal part chopped off ..."

Going back to the example of 50, root is 7.0711 and int(root) is 7. They are of different values.  The code would decide that 50 isn't a square.

Try the s value of 49.  The value in root is 7.0 complete with decimal point. 
int(root)  = 7 with no decimal point. However, their actual values are the same. So the code would decide that, for an s value of 49, we have a perfect square.

When this occurs, the line
return -1 is executed, which means "return TRUE to the calling routine."

If s isn't a perfect square, the line
return 0 is executed, meaning "return FALSE to the calling routine."


Site design/maintenance: Dave Ellis E-mail me!
Last Updated: March 27th, 2005.