T
odays' Friday Quiz maths problem is as follows:
At the Animal Olympics, Charlie Cheetah ran at 90 kilometres per hour, whilst Sid Snail slithered along at 20 hours per kilometre. Charlie kept it up for 18 seconds. How long would it take Sid to cover the same distance as Charlie?
This is not very difficult to work out as long as you make sure to take account of all of the units; hours and seconds, kph vs hpk. I won't spoil it in case you want to work it out for yourself.
despite being a simple calculation, it occurred to me that it would be fun to find the answer by running a simulation - ie show the race graphically, with a clock, and stop the clock when the snail reaches the cheetah. And that it would be fun to run that simulation in real-time (slight spoiler, the answer is a number of hours).
My Minstrel (Jupiter Ace clone) is on my desk at the mo, and I really am getting a lot out of working in Forth. What makes this project particularly interesting is that it needs floating-point numbers.
Forth and specifically Forth on the Ace has floating-point capability. But I've not used it to date. The default type is 16-bit signed integer, taking 1 cell (2 bytes) on the stack. A floating point number takes 4 bytes, 2 cells.
Using floating point is reasonably straightforward - instead of +, -, *, / you use F+, F-, F*. F/ To print a float you use F. There are a few things to remember.
- The floating point arithmetic words expect two floats on the stack. If one or both is an integer then you'll get an unexpected result or stack underflow. It's easy to convert an int to a float (UFLOAT) and float to int (INT).
- To put a float on the stack, you have to remember to include a decimal point; 0.0 instead of 0
- Words like DROP and DUP won't work if you have a float on the stack. @ and ! won't work for a variable which is a float. The manual gives some suggested word definitions for 2DROP, 2DUP, 2@ and 2!
Here's a video of the start of the program, not in real time. Here you can see the cheetah's fast but short sprint.
Now running in real time, it takes around 38 minutes for the snail to move one character space (the whole width of the screen, 32 character spaces, represents 1km)
Here is my Forth program. It's not particularly well-optimised but works fine and I have now commented it well. If left to run for enough hours, finishes at exactly the right answer. To make the program run as fast as possible, and arrive at the answer much more quickly, take out the '50 pause' in the run loop.
Comments
Post a Comment