Making a cons to two fixnums to represent a double-precision number is horribly 
inefficient. Are you going to write double-precision addition, subtraction, 
multiplication and division in Scheme? That isn't even possible without access 
to the carry flag. This kind of low-level code is normally written in 
assembly-language as part of the basic implementation of the language. Bignums 
are also very inefficient --- they are primarily provided for convenience, so 
the users don't have to worry about precision at all. The users aren't 
completely saved from worrying about precision though, as it is still possible 
to screw up (for example, in my LC53 you need to do the multiplication first 
and then the division, and if you do the division first you will get mush).

I like Scheme --- that is why I'm learning it. I think that Scheme is the best 
scripting language around --- Scheme is much better than Python and Ruby and 
all of the other scripting languages available. It is a scripting language 
though --- that is all that I'm expecting from it. For example, in my novice 
package I wrote a program in Forth that generates the images of slide-rules' 
faces in both PostScript and CNC gcode. A program such as that would have been 
much more easily written in Scheme than in Forth. I'm learning Scheme so that I 
can crank out simple programs like this quickly (especially when execution 
speed is not an issue). I wouldn't consider Scheme for writing serious programs 
though.

For a numerical program it is necessary to have mixed-precision arithmetic. 
This includes multiplication of two single-precision integers to get a 
double-precision product, and division of a double-precision integer by a 
single-precision integer to get a single-precision quotient and remainder. 
Scheme, Python, Ruby, C/C++, Fortran, Java, etc., don't have this --- Forth is 
the only language that has this (Factor too, as Slava modified the language at 
my request to do this, although Factor has only a rudimentary capability 
compared to Forth).

P.S. That LC53 challenge was a trick question, as I knew from the get-go that 
Scheme didn't have this capability, and that this was a completely 
inappropriate application for Scheme. I said above that my slide-rule program 
would have been much easier in Scheme than in Forth --- this is an appropriate 
application for Scheme --- perhaps some brave Schemer would like to write a 
Scheme version of that program. You've got all of the examples that you need, 
just by running my program and looking at the result. I would definitely be 
interested in seeing a Scheme version of my program to help me learn Scheme! Of 
course, it is a big waste of time, as the program has no commercial potential 
--- but we are all hobbyists anyway, so it is not like our time is real 
valuable anyway. :-) Maybe one of the teachers will assign this project to his 
students. My knowledge of Scheme currently is too limited for me to port the 
slide-rule program myself, and I am still working
 on pretty simple programs, but maybe I will do it sometime in the future --- 
if nobody else does it first. This isn't a numerical program because there 
isn't any concern about precision, although it does involve basic arithmetic on 
floating-point numbers --- the generation of the scales is inherently 
recursive, you need a simple DSL to describe the scales, and the generation of 
PostScript and gcode is typical data transformation --- this is the kind of 
program that Scheme was designed for.

regards --- Hugh



________________________________
 From: Jens Axel Søgaard <jensa...@soegaard.net>
To: Hugh Aguilar <hughaguila...@yahoo.com> 
Sent: Saturday, November 17, 2012 5:32 AM
Subject: Re: [racket] LC53
 
2012/11/17 Hugh Aguilar <hughaguila...@yahoo.com>:
> Note that when I invented LC53, the 32-bit x86 was still prevalent and I was
> assuming that the system would be 32-bit. Implementing LC53 on the 64-bit
> x86 using 64-bit registers is too easy --- so for this exercise, please
> assume that you are using a 32-bit processor. As often happens in numerical
> programs, overflow of intermediate values will be an issue.

Since fixnum are 30 bit only on 32 bit systems, this can't use fixnums.
If bignums aren't good enough, one can use a cons to two fixnums to
represent 32 bit numbers.

See
https://github.com/plt/racket/blob/master/collects/file/md5.rkt

-- 
Jens Axel Søgaard
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to