Skip to navigation

Aviator on the BBC Micro

Maths: sinLo

Name: sinLo [Show more] Type: Variable Category: Maths Summary: Low byte of the sine lookup table Deep dive: Trigonometry
Context: See this variable in context in the source code References: This variable is used as follows: * Sine16Bit calls sinLo

This table contains sine values for a quarter of a circle, i.e. for the range 0 to 90 degrees, or 0 to PI/2 radians. The table contains values for indexes 0 to 256, which cover the quarter from 0 to PI/2 radians. Entry X in the table is therefore (X / 256) * (PI / 2) radians of the way round the quarter circle, so the table at index X contains the sine of this value. The value of sine across the quarter circle ranges from 0 to 1: sin(0) = 0 sin(90) = sin(PI/2) = 1 but assembly language doesn't support fractions, so instead we store the sine in a 16-bit number that contains the sine multiplied by 65536, so the range of (sinHi sinLo) over the course of the quarter circle is 0 to 65536. It might help to think of sinHi as an integer ranging from 0 to 256 across the quarter circle, with sinLo as the fractional part ranging from 0 to 255; this is the approach taken in the Sine16Bit routine. In other words, entry X in this table contains sin(X) * 65536, where X ranges from 0 to 256 over the course of a quarter circle.
.sinLo FOR I%, 0, 256 N = SIN((I% / 256) * (PI / 2)) IF N >= 1 EQUB 255 ELSE EQUB LO(INT(N * 65536)) ENDIF NEXT