1#include "double_conversion.h"
2#include <math.h>
3#include <stdio.h>
4
5static const double testvalues[] = {
6           0.0,        -0.0,         0.1,         -0.1,
7          M_PI,       -M_PI,  123456.789,  -123456.789,
8      INFINITY,   -INFINITY,         NAN, INFINITY - INFINITY,
9          1e38,       -1e38,        1e39,        -1e39,
10         1e-38,      -1e-38,       1e-39,       -1e-39,
11   3.14159e-37,-3.14159e-37, 3.14159e-43, -3.14159e-43,
12         1e-60,      -1e-60,       1e-45,       -1e-45,
13    0.99999999999999, -0.99999999999999, 127.999999999999, -127.999999999999
14};
15
16#define TESTVALUES_COUNT (sizeof(testvalues)/sizeof(testvalues[0]))
17
18int main()
19{
20    int status = 0;
21    int i;
22    for (i = 0; i < TESTVALUES_COUNT; i++)
23    {
24        double orig = testvalues[i];
25        float expected_float = (float)orig;
26        double expected_double = (double)expected_float;
27
28        float got_float = double_to_float(*(uint64_t*)&orig);
29        uint64_t got_double = float_to_double(got_float);
30
31        uint32_t e1 = *(uint32_t*)&expected_float;
32        uint32_t g1 = *(uint32_t*)&got_float;
33        uint64_t e2 = *(uint64_t*)&expected_double;
34        uint64_t g2 = got_double;
35
36        if (g1 != e1)
37        {
38            printf("%3d double_to_float fail: %08x != %08x\n", i, g1, e1);
39            status = 1;
40        }
41
42        if (g2 != e2)
43        {
44            printf("%3d float_to_double fail: %016llx != %016llx\n", i,
45                (unsigned long long)g2,
46                (unsigned long long)e2);
47            status = 1;
48        }
49    }
50
51    return status;
52}
53
54
55
56
57