-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolution.c
111 lines (82 loc) · 2.43 KB
/
solution.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
/**
* Library-level functions.
* You should use them in the main sections.
*/
uint64_t convertToUint64 (double number) {
return *((uint64_t *)(&number));
}
bool getBit (const uint64_t number, const uint8_t index) {
return number & (1ull << index);
}
/**
* Checkers here:
*/
bool checkForPlusZero (uint64_t number) {
return number == 0x0000000000000000;
}
bool checkForMinusZero (uint64_t number) {
return number == 0x8000000000000000;
}
bool checkForPlusInf (uint64_t number) {
return number == 0x7FF0000000000000;
}
bool checkForMinusInf (uint64_t number) {
return number == 0xFFF0000000000000;
}
bool checkForPlusNormal (uint64_t number) {
return (number & 0x8000000000000000) == 0 && (number & 0x7FF0000000000000) > 0;
}
bool checkForMinusNormal (uint64_t number) {
return (number & 0x8000000000000000) > 0 && (number & 0x7FF0000000000000) > 0;
}
bool checkForPlusDenormal (uint64_t number) {
return (number & 0xFFF0000000000000) == 0;
}
bool checkForMinusDenormal (uint64_t number) {
return (number & 0xFFF0000000000000) == 0x8000000000000000;
}
bool checkForSignalingNan (uint64_t number) {
return (number & 0x7FF8000000000000) == 0x7FF0000000000000;
}
bool checkForQuietNan (uint64_t number) {
return (number & 0x7FF8000000000000) == 0x7FF8000000000000;
}
void classify (double number) {
if (checkForPlusZero(convertToUint64(number))) {
printf("Plus zero\n");
}
else if (checkForMinusZero(convertToUint64(number))) {
printf("Minus zero\n");
}
else if (checkForPlusInf(convertToUint64(number))) {
printf("Plus inf\n");
}
else if (checkForMinusInf(convertToUint64(number))) {
printf("Minus inf\n");
}
else if (checkForPlusNormal(convertToUint64(number))) {
printf("Plus normal\n");
}
else if (checkForMinusNormal(convertToUint64(number))) {
printf("Minus normal\n");
}
else if (checkForPlusDenormal(convertToUint64(number))) {
printf("Plus Denormal\n");
}
else if (checkForMinusDenormal(convertToUint64(number))) {
printf("Minus Denormal\n");
}
else if (checkForSignalingNan(convertToUint64(number))) {
printf("Signailing NaN\n");
}
else if (checkForQuietNan(convertToUint64(number))) {
printf("Quiet NaN\n");
}
else {
printf("Error.\n");
}
}