mirror of
https://github.com/pkivolowitz/asm_book.git
synced 2026-06-21 04:46:47 +08:00
114 lines
2.6 KiB
Markdown
114 lines
2.6 KiB
Markdown
# Compute Sine using Taylor Series
|
|
|
|
## Overview
|
|
|
|
This project stresses the use of floating point instructions to create
|
|
a program that computes the sine of an angle given to you in degrees
|
|
on the command line.
|
|
|
|
## Taylor Series
|
|
|
|
The sine of an angle given in radians can be found using the Taylor
|
|
Series:
|
|
|
|
```text
|
|
sin x = x - x^3/3! + x^5/5! - x^7/7! ...
|
|
```
|
|
|
|
Notice each term flips from addition to subtraction.
|
|
|
|
Notice each term is based on the odd integers starting at 1. While the
|
|
"1" case might look different, it is the same as all the others since
|
|
1 is just 1 to the first power divided by 1 factorial.
|
|
|
|
## Command line
|
|
|
|
You are to accept two arguments on the command line. `getopt` is not
|
|
being used here to concentrate on the floating point math. Both
|
|
arguments are therefore required.
|
|
|
|
* The angle in degrees whose sine you wish to calculate. Take this to
|
|
be a double.
|
|
|
|
* The number of terms to evaluate. The number of terms must lie between
|
|
1 and 10 inclusive. Note the value of 10 as an upper bound in new. It
|
|
was 8.
|
|
|
|
## C version
|
|
|
|
To assist your efforts, [here](./c_version.c) is a version of this
|
|
project written in C. This has been updated to print nice debugging
|
|
output which is not part of the project.
|
|
|
|
This C version also demonstrates a different way of calculating the
|
|
toggle. This version flips the sign of the toggle by multiplying by -1.
|
|
The previous version used odd and even values of the term.
|
|
|
|
## Sample executions
|
|
|
|
```text
|
|
pk_taylor_series > gcc main.S -o a
|
|
pk_taylor_series > ./a 0 10
|
|
The sine of 0.00 degrees is 0.00000000.
|
|
pk_taylor_series > ./a 30 10
|
|
The sine of 30.00 degrees is 0.50000000.
|
|
pk_taylor_series > ./a 45 10
|
|
The sine of 45.00 degrees is 0.70710678.
|
|
pk_taylor_series > ./a 90 10
|
|
The sine of 90.00 degrees is 1.00000000.
|
|
pk_taylor_series > ./a 180 10
|
|
The sine of 180.00 degrees is -0.00000000.
|
|
pk_taylor_series > ./a 360 10
|
|
The sine of 360.00 degrees is -0.00104818.
|
|
pk_taylor_series > ./a 360 100
|
|
Number of terms is out of range.
|
|
pk_taylor_series > ./a 360 -1
|
|
Number of terms is out of range.
|
|
pk_taylor_series >
|
|
```
|
|
|
|
## Floating point instructions I used
|
|
|
|
These are the floating point instructions I used in my implementation.
|
|
|
|
* fmov
|
|
|
|
* scvtf
|
|
|
|
* fmul
|
|
|
|
* fdiv
|
|
|
|
* fadd
|
|
|
|
## How I broke up the program
|
|
|
|
I have functions named:
|
|
|
|
* main
|
|
|
|
* HandleOptions
|
|
|
|
* Factorial
|
|
|
|
* IntegerPower - x to the nth power
|
|
|
|
* ComputeSine - The main calculation
|
|
|
|
* PrintAnswer
|
|
|
|
* ConvertTheta - Wrap D2R
|
|
|
|
* D2R - Degrees to radians
|
|
|
|
## CSC3510
|
|
|
|
The following applies to Carthage College CSC3510 students.
|
|
|
|
### Work rules
|
|
|
|
Work is to be done solo.
|
|
|
|
### What to hand in
|
|
|
|
Just the .S file. **Your name must be at the top of the file.**
|