25 comments

[ 1.6 ms ] story [ 68.2 ms ] thread
Astronaut: Wait, it's all "if" statements?

Astronaut with gun: Always has been

Lisp boffins who had been building AI this exact way for decades: noncommittal silence
It's worse, turns out in the end it's just 0s and 1s.
(comment deleted)
The observer astronaut back on Earth: you two weren't supposed to say that!
The final step in their "How it works" diagram:

"Intelligent C64s restore themselves to their former position of prominence. The singularity is near."

This was really useful for me.

Seeing the c64 basic code produced (0) is only 6000 lines, a comparison to how a human would (re-)write the SIN() function is now feasible.

(0) https://github.com/nickbild/tflite_c64/blob/main/neural_net....

Edit: clarification

It’s actually 5580 / 10 = 558 lines because the line numbers increment by 10, and you can see the actual line count in the GitHub editor too :)
Of course, I was stupid. Thanks for correction!
neato. what kind of chip you got in there, a dorito?
These two if statements are repeated frequently. I bet they can be optimized but for the life of me, I can’t think of an improvement.

5550 if acc < -128 then acc = -128

5560 if acc > 127 then acc = 127

Anyone?

acc = min(max(acc, -128), 127)?
Commodore 64 basic doesn’t have min or max functions.

DEF (https://www.c64-wiki.com/wiki/DEF) would be the way to do this, but I don’t see how to write a performant version in a single expression (you can’t use IF as an expression. You could cast to float, compute some specially chosen sigmoid function, and round to int, but that’s slow)

A USR function (https://www.c64-wiki.com/wiki/USR) would work, but that’s cheating.

Almost seems like you could get there by bit twiddling, but I'm not sure. What's "-1 AND 127" in Commodore basic?
127.

I don’t think bit masking alone will get you there. You want to map anything over 0x80 to 0x7F.

I think you can do something like

  x + (x < -127) * (x + 127) + (x > 127)) * (x - 127)
      ^^^^^^^^^^^^^^^^^^^^^^
can give you clamping, but haven’t checked it ((x < -127) is minus one for true or zero for false, so the part marked ^^^^ subtracts x + 127 from x when it is too low, and that’s equivalent to subtracting x (yielding zero) and subtracting -127 (yielding -127). The other part is similar, but for values that are too high.

That expression can be put in a DEF FN.

Can you benchmark this against a nvidia rtx 3090, must be close
With no native floating point type and no parallelism whatsoever, I hate to admit it, but the C64 isn't the optimal platform for this sort of thing.

(Apropos floating point, are you SURE it runs the same, Nick? those aren't exactly IEEE 754 floats you've got there!)