-
Notifications
You must be signed in to change notification settings - Fork 0
/
clock.c
66 lines (57 loc) · 1.82 KB
/
clock.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "clock.h"
#include <stdio.h>
#define ONE_BILLION 1000000000
void increment_clock(struct clock* clock, int increment) {
clock->nanoseconds += increment;
if (clock->nanoseconds >= ONE_BILLION) {
clock->seconds += 1;
clock->nanoseconds -= ONE_BILLION;
}
}
struct clock add_clocks(struct clock c1, struct clock c2) {
struct clock out = {
.seconds = 0,
.nanoseconds = 0
};
out.seconds = c1.seconds + c2.seconds;
increment_clock(&out, c1.nanoseconds + c2.nanoseconds);
return out;
}
int compare_clocks(struct clock c1, struct clock c2) {
if (c1.seconds > c2.seconds) {
return 1;
}
if ((c1.seconds == c2.seconds) && (c1.nanoseconds > c2.nanoseconds)) {
return 1;
}
if ((c1.seconds == c2.seconds) && (c1.nanoseconds == c2.nanoseconds)) {
return 0;
}
return -1;
}
long double clock_to_seconds(struct clock c) {
long double seconds = c.seconds;
long double nanoseconds = (long double)c.nanoseconds / ONE_BILLION;
seconds += nanoseconds;
return seconds;
}
struct clock seconds_to_clock(long double seconds) {
struct clock clk = { .seconds = (int)seconds };
seconds -= clk.seconds;
clk.nanoseconds = seconds * ONE_BILLION;
return clk;
}
struct clock calculate_avg_time(struct clock clk, int divisor) {
long double seconds = clock_to_seconds(clk);
long double avg_seconds = seconds / divisor;
return seconds_to_clock(avg_seconds);
}
struct clock subtract_clocks(struct clock c1, struct clock c2) {
long double seconds1 = clock_to_seconds(c1);
long double seconds2 = clock_to_seconds(c2);
long double result = seconds1 - seconds2;
return seconds_to_clock(result);
}
void print_clock(char* name, struct clock clk) {
printf("%-15s: %'ld:%'ld\n", name, clk.seconds, clk.nanoseconds);
}