Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is TI-Basic so slow?

I decided to implement a program that can find the GCD of any two numbers (including non-integers) in TI-Basic. I've used this just fine in Java, so I know it works. It works just fine in TI-Basic, but when compared with the built-in gcd( function, it's very sluggish; the gcd( function seems to get a result in milliseconds, where mine can take several seconds. Why is TI-Basic so much slower than the predefined calculator functions?

The code


Here is the program's code in TI-Basic, for your inspection:

PROGRAM:GCD

:ClrHome
:Disp "Greatest Common","    Divisor","      ---"
:Input "First number? ",X
:Input "Second number? ",Y
:
:X→I
:Y→J
:
:If (I≠int(I) or J≠int(J))
:Then
:ClrHome
:Disp "Non-integer","inputs may be","innacurate!",""
:End
:If (I=1 or J=1)
:Then
:1→I
:1→J
:Goto Z
:End
:For(C,0,2^8)
:If I=J
:Goto Z
:
:If I>J
:I-J→I
:
:If J>I
:J-I→J
:
:End
:
:Disp "This is a hard","one! Thinking","harder..."
:
:For(C,0,2^15)
:If (I=J)
:Goto Z
:While (I>J)
:I-J→I
:C+1→C
:End
:While (J>I)
:J-I→J
:C+1→C
:End
:End
:
:Disp "TIMED OUT!","Either:",J,"or"
:Pause
:
:Lbl Z
:ClrHome
:Disp "GCD of",X,"and",Y,"is",I

Disclaimer: This is the result of me looking at my TI-84 and typing it here. Some typos might be in it, though I tried my best to keep it the same

For those of you who might not know what this means, pseudocode is provided below:

program gcd()
{
Console.clear();
Console.writeln("Greatest Common");
Console.writeln("    Divisor");
Console.writeln("      ---");

float X = Console.readFloat("First Number? ");
float Y = Console.readFloat("Second number? ");

float I = X;
float J = Y;

if (I != (int)I || J != (int)J)
{
  Console.clear();
  Console.writeln("Non-integer");
  Console.writeln("inputs may be");
  Console.writeln("inaccurate!");
  Console.writeln("");
}
if (I == 1 or J == 1)
{
  I = 1;
  J = 1;
  goto Z;
}

for(int C = 0, limit = Math.pow(2,8); C < limit; C++)
{
  if (I == J)
    goto Z;

  if (I > J)
    I = I - J;

  if (J > I)
    J = J - I;
}

Console.writeln("This is a hard");
Console.writeln("one! Thinking");
Console.writeln("harder...");

for(int C = 0, limit = Math.pow(2,15); C < limit; C++)
{
  if (I == J)
    goto z;
  while (I > J)
  {
    I = I - J;
    C++;
  }
  while (J>I)
  {
    J = J-I;
    C++;
  }
}

Console.writeln("TIMED OUT!");
Console.writeln("Either:");
Console.writeln(J);
Console.writeln("or");
Console.pause();

Z:
Console.clear();
Console.writeln("GCD of");
Console.writeln(X);
Console.writeln("and");
Console.writeln(Y);
Console.writeln("is");
Console.writeln(I);
}
like image 895
Ky. Avatar asked Sep 24 '12 20:09

Ky.


3 Answers

It's slow because it's an interpreted language - Disadvantages of interpreted languages.

Basically this affects grabbing user input, as well as displaying graphics on-screen.

like image 74
dsgriffin Avatar answered Sep 30 '22 11:09

dsgriffin


You could fix a lot of the code, like not using Goto, leaving parentheses off the ends of lines, not using ClrHome, etc. More info: https://en.wikibooks.org/wiki/TI-Basic_Z80_Programming/Tips,_Tricks_and_Optimizations

like image 21
Zenedus Avatar answered Sep 30 '22 11:09

Zenedus


Another reason for it being slow, is because of the clrHome, I have realized while using them, clr-home takes a moment to complete, maybe half a second, at least on the Ti-83 plus, normally disp and input don't take much, also instead of the two inputs, you could also use prompt fist number','second number'

like image 22
AllAwesome497 Avatar answered Sep 30 '22 10:09

AllAwesome497