forked from xlnsresearch/xlnscpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxlns16_32rndtest.cpp
More file actions
131 lines (114 loc) · 3.09 KB
/
Copy pathxlns16_32rndtest.cpp
File metadata and controls
131 lines (114 loc) · 3.09 KB
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//some numeric tests of xlns16.cpp; see github.com/xlnsresearch/xlns/examples for a similar python test
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define xlns32_ideal
#include "xlns32.cpp"
//xlns32_aicasb needs to be defined for accurate 32-bit sums using xlns32_add_lpvip
#define xlns32_aicasb
#include "xlns32lpvip.cpp"
#define xlns16_ideal
// #define xlns16_alt
// #define xlns16_altopt
#define xlns16_table
#include "xlns16.cpp"
float rndfp[10000];
void initrndfp(float rndfp[],int limit)
{
int i;
for (i=0; i<limit; i++)
{
rndfp[i] = 4.0*((float) rand())/RAND_MAX - 1.0;
//printf("%f\n",rndfp[i]);
}
}
float frndtest1fp(int limit,float rndfp[])
{
float sum;
int i;
sum = 0;
for (i=1; i<=limit; i++) //scaled down to 100
{
sum += rndfp[i];
}
//printf("rndtest1fp sum=%f\n", sum);
return sum;
}
float frndtest1bf16(int limit,float rndfp[])
{
float sum;
int i;
int bfval;
sum = 0;
for (i=1; i<=limit; i++) //scaled down to 100
{
bfval = 0xFFFF0000&*((unsigned int *) &rndfp[i]);
sum += *((float *) &bfval);
}
//printf("rndtest1fp sum=%f\n", sum);
return sum;
}
float frndtest1xlns16(int limit, float rfp[])
{
xlns16 sum;
int i;
sum = fp2xlns16(0.0);
for (i=1; i<=limit; i++) //scaled down to 100
{
sum = xlns16_add(sum,fp2xlns16(rndfp[i]));
}
//printf("rndtest1xlns16 sum=%f\n", xlns162fp(sum));
return xlns162fp(sum);
}
float frndtest1xlns32(int limit, float rndfp[])
{
xlns16 halfval;
xlns32 sum;
int i;
sum = fp2xlns32(0.0);
for (i=1; i<=limit; i++) //scaled down to 100
{
halfval = fp2xlns16(rndfp[i]);
sum = xlns32_add(sum,((xlns32)halfval)<<16);
}
//printf("rndtest1xlns16 sum=%f\n", xlns162fp(sum));
return xlns322fp(sum);
}
float frndtest1lpvip32(int limit, float rndfp[])
{
xlns16 halfval;
xlns32 sum;
int i;
sum = fp2xlns32(0.0);
for (i=1; i<=limit; i++) //scaled down to 100
{
halfval = fp2xlns16(rndfp[i]);
sum = xlns32_add_lpvip(sum,((xlns32)halfval)<<16);
}
//printf("rndtest1xlns16 sum=%f\n", xlns162fp(sum));
return xlns322fp(sum);
}
int main()
{
int limit;
float rfp;
float rlns,rerr,rlns32,rerr32,rlns32lpvip,rerr32lpvip;
float rfp16,rerr16;
printf(" n fp32(exact) bf16 rerr xlns16 rerr xlns32/16 rerr lpvip32/xlns16 rerr\n");
for (limit=1000; limit<=10000; limit+=500)
{
initrndfp(rndfp,limit);
rfp = frndtest1fp(limit, rndfp);
rlns = frndtest1xlns16(limit, rndfp);
rerr = fabs((rfp-rlns)/rfp);
rfp16 = frndtest1bf16(limit, rndfp);
rerr16 = fabs((rfp-rfp16)/rfp);
rlns32 = frndtest1xlns32(limit, rndfp);
rerr32 = fabs((rfp-rlns32)/rfp);
rlns32lpvip = frndtest1lpvip32(limit, rndfp);
rerr32lpvip = fabs((rfp-rlns32lpvip)/rfp);
printf("%5i %12.6f %12.6f %8.6f %12.6f %8.6f %12.6f %8.6f %12.6f %8.6f\n",
limit,rfp,rfp16,rerr16,rlns,rerr,rlns32,rerr32,rlns32lpvip,rerr32lpvip);
}
return 1;
}