1. Introduction
The C programming language is widely used in system development and embedded systems, demonstrating high performance in situations that require fast processing. In particular, trigonometric functions are essential for mathematical calculations used in physics simulations, graphics rendering, signal processing, and many other applications.
This article provides a detailed explanation of trigonometric functions in C, from basic usage to practical applications. Beginners can solidify their understanding of the fundamentals, while intermediate and advanced users can improve their practical skills through applied examples.
What You Will Learn in This Article
- Basic usage of trigonometric functions in C
- Behavior and purpose of each function
- Practical examples and performance optimization tips
We will go through detailed explanations of each function along with sample code, so be sure to read until the end.
2. List of Trigonometric Functions in C and Their Features
In C, to use mathematical functions, you need to include the standard library <math.h>
. This library provides a variety of functions for handling trigonometric operations. Below, we categorize and introduce these functions by their purpose.
Basic Functions
sin(double x)
– Returns the sine of the given angle (in radians).cos(double x)
– Returns the cosine of the given angle (in radians).tan(double x)
– Returns the tangent of the given angle (in radians).
Inverse Trigonometric Functions
asin(double x)
– Calculates the arcsine of the given value (result in radians).acos(double x)
– Calculates the arccosine of the given value.atan(double x)
– Calculates the arctangent of the given value.
Special Function
atan2(double y, double x)
– Returns the angle (in radians) of the coordinate (x, y). This function can handle numerator and denominator separately, avoiding division-by-zero errors.
Helper Function
hypot(double x, double y)
– Calculates the distance from the point (x, y) to the origin using the Pythagorean theorem.
Note: Angle Units
All trigonometric functions in C operate in radians. If your input is in degrees, you need to convert it.
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double degree = 45.0;
double radian = degree * (PI / 180.0); // Convert degrees to radians
printf("sin(45 degrees) = %f\n", sin(radian));
return 0;
}
This code calculates the sine of 45 degrees and displays the result. Always be aware of the difference between degrees and radians.

3. Basic Usage of Trigonometric Functions
Here, we will explain the basic usage of trigonometric functions in C with specific code examples.
Using Sine, Cosine, and Tangent
Example: Basic usage of sin(), cos(), tan()
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double angle = 45.0; // in degrees
double radian = angle * (PI / 180.0); // convert to radians
printf("sin(%.2f degrees) = %.6f\n", angle, sin(radian));
printf("cos(%.2f degrees) = %.6f\n", angle, cos(radian));
printf("tan(%.2f degrees) = %.6f\n", angle, tan(radian));
return 0;
}
Sample Output:
sin(45.00 degrees) = 0.707107
cos(45.00 degrees) = 0.707107
tan(45.00 degrees) = 1.000000
Using Inverse Trigonometric Functions
Inverse trigonometric functions are used to determine angles from given values.
Example: Basic usage of asin(), acos(), atan()
#include <stdio.h>
#include <math.h>
int main() {
double value = 0.5; // input value
printf("asin(%.2f) = %.6f (radians)\n", value, asin(value));
printf("acos(%.2f) = %.6f (radians)\n", value, acos(value));
printf("atan(%.2f) = %.6f (radians)\n", value, atan(value));
return 0;
}
Sample Output:
asin(0.50) = 0.523599 (radians)
acos(0.50) = 1.047198 (radians)
atan(0.50) = 0.463648 (radians)
Using the atan2() Function
The atan2()
function is useful for calculating the angle of a point in Cartesian coordinates.
Example: Calculating an angle with atan2()
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double x = 1.0;
double y = 1.0;
double angle = atan2(y, x) * (180.0 / PI); // convert radians to degrees
printf("Angle of point (%.1f, %.1f) = %.2f degrees\n", x, y, angle);
return 0;
}
Sample Output:
Angle of point (1.0, 1.0) = 45.00 degrees
This code uses atan2() to calculate the angle of the point (1.0, 1.0) and outputs the result in degrees. This function safely avoids division-by-zero errors.
4. Practical Applications
Now, let’s look at some real-world use cases for trigonometric functions.
Rotation Transformations in Graphics
Trigonometric functions are often used to perform rotation transformations in both 2D and 3D graphics.
Example: Rotating a 2D coordinate
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
void rotate_point(double x, double y, double angle) {
double radian = angle * (PI / 180.0);
double x_new = x * cos(radian) - y * sin(radian);
double y_new = x * sin(radian) + y * cos(radian);
printf("Coordinates after rotation: (%.2f, %.2f)\n", x_new, y_new);
}
int main() {
double x = 1.0, y = 0.0;
double angle = 45.0;
printf("Original coordinates: (%.2f, %.2f)\n", x, y);
rotate_point(x, y, angle);
return 0;
}
Sample Output:
Original coordinates: (1.00, 0.00)
Coordinates after rotation: (0.71, 0.71)
This program calculates the coordinates of the point (1.0, 0.0) after a 45-degree rotation.
Example in Physics Simulation
Example: Simulating pendulum motion
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double length = 1.0; // pendulum length (m)
double gravity = 9.81; // gravitational acceleration (m/s^2)
double time = 0.0; // time
double period = 2 * PI * sqrt(length / gravity); // period
printf("Time (s) Angle (rad)\n");
for (int i = 0; i <= 10; i++) {
double angle = 0.1 * cos(2 * PI * time / period); // small-amplitude approximation
printf("%.2f %.4f\n", time, angle);
time += 0.1;
}
return 0;
}
Sample Output:
Time (s) Angle (rad)
0.00 0.1000
0.10 0.0998
0.20 0.0993
0.30 0.0985
This code simulates pendulum motion and outputs the change in angle over time.
5. Optimizing Accuracy and Performance
When working with trigonometric functions in C, both calculation accuracy and performance optimization are important. This section explains approaches to balancing precision and speed.
Accuracy Considerations
Rounding Errors
Floating-point calculations can introduce rounding errors. This is especially true when working with very small or very large values, where errors may accumulate.
Example: Rounding error occurrence
#include <stdio.h>
#include <math.h>
int main() {
double angle = 90.0; // in degrees
double radian = angle * (M_PI / 180.0); // convert to radians
double result = cos(radian);
printf("cos(90 degrees) = %.15f\n", result); // Ideally expected: 0.000000000000000
return 0;
}
Sample Output:
cos(90 degrees) = 0.000000000000001
Solution:
- Use approximate comparisons: Compare using a tolerance, e.g.,
fabs(result) < 1e-10
, to account for floating-point error.
Using Fast Approximation Algorithms
Improving computation speed
Since trigonometric calculations can be CPU-intensive, performance-critical applications may use approximation formulas or dedicated algorithms.
Example: Fast sine approximation (Taylor series)
double fast_sin(double x) {
double x2 = x * x;
return x * (1.0 - x2 / 6.0 + x2 * x2 / 120.0); // Taylor series approximation
}
This code approximates sine using the Taylor series. While precision slightly decreases, computation speed improves.
Performance Benchmark Test
Measuring performance
To measure performance, use standard timing functions.
Example: Measuring execution time
#include <stdio.h>
#include <math.h>
#include <time.h>
double fast_sin(double x) {
double x2 = x * x;
return x * (1.0 - x2 / 6.0 + x2 * x2 / 120.0);
}
int main() {
clock_t start, end;
double result;
start = clock(); // start timing
for (int i = 0; i < 1000000; i++) {
result = sin(1.0);
}
end = clock(); // end timing
printf("Execution time for standard sin(): %f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
start = clock();
for (int i = 0; i < 1000000; i++) {
result = fast_sin(1.0);
}
end = clock();
printf("Execution time for fast_sin(): %f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
Sample Output:
Execution time for standard sin(): 0.030000 seconds
Execution time for fast_sin(): 0.010000 seconds
This example compares execution times between the standard and fast sine functions. Choosing the right approach depending on your use case can improve efficiency.
6. Best Practices and Precautions
When working with trigonometric functions, keep the following points in mind while writing your programs.
1. Managing Angle Units
- Issue: Bugs can occur when degrees and radians are mixed.
- Solution: Clearly indicate the unit in function or variable names.
Example: Use variable names like angle_deg
or angle_rad
.
2. Error Handling
Trigonometric functions can return NaN
(Not a Number) if the input value is invalid. Handle such cases appropriately.
Example: Checking for NaN
#include <stdio.h>
#include <math.h>
int main() {
double value = 2.0; // Out of range for arcsine: -1 <= x <= 1
double result = asin(value);
if (isnan(result)) {
printf("Error: Invalid input value.\n");
} else {
printf("Result: %.6f\n", result);
}
return 0;
}
Sample Output:
Error: Invalid input value.
7. Conclusion
In this article, we covered the basics and practical applications of trigonometric functions in C, as well as strategies for optimizing both precision and performance.
Key Takeaways:
- Basic usage of trigonometric functions with sample code
- Practical applications such as graphics rotation and physics simulation
- Techniques for optimizing accuracy and performance
Next Steps:
- Learn how to apply other mathematical functions (e.g., exponential and logarithmic functions)
- Deepen your understanding of advanced numerical analysis algorithms
Trigonometric functions in C are powerful tools that can be applied in many fields. Use this guide as a reference and try incorporating them into your own projects!