mirror of
https://codeberg.org/ziglings/exercises.git
synced 2026-06-08 07:50:00 +00:00
Insert space for additional async exercises
This commit is contained in:
41
exercises/097_c_math.zig
Normal file
41
exercises/097_c_math.zig
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Often, C functions are used where no equivalent Zig function exists
|
||||
// yet. Okay, that's getting less and less. ;-)
|
||||
//
|
||||
// Since the integration of a C function is very simple, as already
|
||||
// seen in the last exercise, it naturally offers itself to use the
|
||||
// very large variety of C functions for our own programs.
|
||||
// As an example:
|
||||
//
|
||||
// Let's say we have a given angle of 765.2 degrees. If we want to
|
||||
// normalize that, it means that we have to subtract X * 360 degrees
|
||||
// to get the correct angle.
|
||||
// How could we do that? A good method is to use the modulo function.
|
||||
// But if we write "765.2 % 360", it only works with float values
|
||||
// that are known at compile time.
|
||||
// In Zig, we would use @mod(a, b) instead.
|
||||
//
|
||||
// Let us now assume that we cannot do this in Zig, but only with
|
||||
// a C function from the standard library. In the library "math",
|
||||
// there is a function called "fmod"; the "f" stands for floating
|
||||
// and means that we can solve modulo for real numbers. With this
|
||||
// function, it should be possible to normalize our angle.
|
||||
// Let's go.
|
||||
|
||||
const std = @import("std");
|
||||
|
||||
const c = @cImport({
|
||||
// What do we need here?
|
||||
???
|
||||
});
|
||||
|
||||
pub fn main() !void {
|
||||
const angle = 765.2;
|
||||
const circle = 360;
|
||||
|
||||
// Here we call the C function 'fmod' to get our normalized angle.
|
||||
const result = c.fmod(angle, circle);
|
||||
|
||||
// We use formatters for the desired precision and to truncate the decimal places
|
||||
std.debug.print("The normalized angle of {d: >3.1} degrees is {d: >3.1} degrees.\n", .{ angle, result });
|
||||
}
|
||||
Reference in New Issue
Block a user