15 #include "absl/random/internal/generate_real.h"
22 #include "gtest/gtest.h"
23 #include "absl/flags/flag.h"
24 #include "absl/numeric/bits.h"
27 "Number of trials for the probability tests.");
36 TEST(GenerateRealTest, U64ToFloat_Positive_NoZero_Test) {
38 return GenerateRealFromBits<float, GeneratePositiveTag, false>(
a);
40 EXPECT_EQ(ToFloat(0x0000000000000000), 2.710505431e-20
f);
41 EXPECT_EQ(ToFloat(0x0000000000000001), 5.421010862e-20
f);
42 EXPECT_EQ(ToFloat(0x8000000000000000), 0.5);
43 EXPECT_EQ(ToFloat(0x8000000000000001), 0.5);
44 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 0.9999999404
f);
47 TEST(GenerateRealTest, U64ToFloat_Positive_Zero_Test) {
49 return GenerateRealFromBits<float, GeneratePositiveTag, true>(
a);
51 EXPECT_EQ(ToFloat(0x0000000000000000), 0.0);
52 EXPECT_EQ(ToFloat(0x0000000000000001), 5.421010862e-20
f);
53 EXPECT_EQ(ToFloat(0x8000000000000000), 0.5);
54 EXPECT_EQ(ToFloat(0x8000000000000001), 0.5);
55 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 0.9999999404
f);
58 TEST(GenerateRealTest, U64ToFloat_Negative_NoZero_Test) {
60 return GenerateRealFromBits<float, GenerateNegativeTag, false>(
a);
62 EXPECT_EQ(ToFloat(0x0000000000000000), -2.710505431e-20
f);
63 EXPECT_EQ(ToFloat(0x0000000000000001), -5.421010862e-20
f);
64 EXPECT_EQ(ToFloat(0x8000000000000000), -0.5);
65 EXPECT_EQ(ToFloat(0x8000000000000001), -0.5);
66 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404
f);
69 TEST(GenerateRealTest, U64ToFloat_Negative_Zero_Test) {
71 return GenerateRealFromBits<float, GenerateNegativeTag, true>(
a);
73 EXPECT_EQ(ToFloat(0x0000000000000000), 0.0);
74 EXPECT_EQ(ToFloat(0x0000000000000001), -5.421010862e-20
f);
75 EXPECT_EQ(ToFloat(0x8000000000000000), -0.5);
76 EXPECT_EQ(ToFloat(0x8000000000000001), -0.5);
77 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404
f);
80 TEST(GenerateRealTest, U64ToFloat_Signed_NoZero_Test) {
82 return GenerateRealFromBits<float, GenerateSignedTag, false>(
a);
84 EXPECT_EQ(ToFloat(0x0000000000000000), 5.421010862e-20
f);
85 EXPECT_EQ(ToFloat(0x0000000000000001), 1.084202172e-19
f);
86 EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), 0.9999999404
f);
87 EXPECT_EQ(ToFloat(0x8000000000000000), -5.421010862e-20
f);
88 EXPECT_EQ(ToFloat(0x8000000000000001), -1.084202172e-19
f);
89 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404
f);
92 TEST(GenerateRealTest, U64ToFloat_Signed_Zero_Test) {
94 return GenerateRealFromBits<float, GenerateSignedTag, true>(
a);
96 EXPECT_EQ(ToFloat(0x0000000000000000), 0);
97 EXPECT_EQ(ToFloat(0x0000000000000001), 1.084202172e-19
f);
98 EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), 0.9999999404
f);
99 EXPECT_EQ(ToFloat(0x8000000000000000), 0);
100 EXPECT_EQ(ToFloat(0x8000000000000001), -1.084202172e-19
f);
101 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), -0.9999999404
f);
104 TEST(GenerateRealTest, U64ToFloat_Signed_Bias_Test) {
106 return GenerateRealFromBits<float, GenerateSignedTag, true>(
a, 1);
108 EXPECT_EQ(ToFloat(0x0000000000000000), 0);
109 EXPECT_EQ(ToFloat(0x0000000000000001), 2 * 1.084202172e-19
f);
110 EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), 2 * 0.9999999404
f);
111 EXPECT_EQ(ToFloat(0x8000000000000000), 0);
112 EXPECT_EQ(ToFloat(0x8000000000000001), 2 * -1.084202172e-19
f);
113 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 2 * -0.9999999404
f);
116 TEST(GenerateRealTest, U64ToFloatTest) {
118 return GenerateRealFromBits<float, GeneratePositiveTag, true>(
a);
126 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), 0.9999999404
f);
130 EXPECT_NE(ToFloat(0x7FFFFF0000000000), ToFloat(0x7FFFFEFFFFFFFFFF));
136 EXPECT_NE(
static_cast<int32_t>(ToFloat(0xFFFFFFFFFFFFFFFF) * two_to_24 * 2),
138 EXPECT_EQ(ToFloat(0xFFFFFFFFFFFFFFFF), ToFloat(0xFFFFFF0000000000));
139 EXPECT_NE(ToFloat(0xFFFFFFFFFFFFFFFF), ToFloat(0xFFFFFEFFFFFFFFFF));
140 EXPECT_EQ(ToFloat(0x7FFFFFFFFFFFFFFF), ToFloat(0x7FFFFF8000000000));
141 EXPECT_NE(ToFloat(0x7FFFFFFFFFFFFFFF), ToFloat(0x7FFFFF7FFFFFFFFF));
142 EXPECT_EQ(ToFloat(0x3FFFFFFFFFFFFFFF), ToFloat(0x3FFFFFC000000000));
143 EXPECT_NE(ToFloat(0x3FFFFFFFFFFFFFFF), ToFloat(0x3FFFFFBFFFFFFFFF));
147 for (
int i = 0;
i < 100; ++
i) {
148 EXPECT_EQ(
i * ToFloat(0x0000000000000001), ToFloat(
i));
152 float exp_values[64];
153 exp_values[63] = 0.5f;
154 for (
int i = 62;
i >= 0; --
i) exp_values[
i] = 0.5
f * exp_values[
i + 1];
156 for (
int i = 0;
i < 64; ++
i) {
158 for (
int j = 1;
j < FLT_MANT_DIG &&
i -
j >= 0; ++
j) {
159 EXPECT_NE(exp_values[
i] + exp_values[
i - j], exp_values[
i]);
161 exp_values[
i] + exp_values[
i - j]);
163 for (
int j = FLT_MANT_DIG;
i -
j >= 0; ++
j) {
164 EXPECT_EQ(exp_values[
i] + exp_values[
i - j], exp_values[
i]);
165 EXPECT_EQ(ToFloat((one <<
i) + (one << (
i - j))), exp_values[
i]);
170 TEST(GenerateRealTest, U64ToDouble_Positive_NoZero_Test) {
172 return GenerateRealFromBits<double, GeneratePositiveTag, false>(
a);
175 EXPECT_EQ(ToDouble(0x0000000000000000), 2.710505431213761085e-20);
176 EXPECT_EQ(ToDouble(0x0000000000000001), 5.42101086242752217004e-20);
177 EXPECT_EQ(ToDouble(0x0000000000000002), 1.084202172485504434e-19);
178 EXPECT_EQ(ToDouble(0x8000000000000000), 0.5);
179 EXPECT_EQ(ToDouble(0x8000000000000001), 0.5);
180 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), 0.999999999999999888978);
183 TEST(GenerateRealTest, U64ToDouble_Positive_Zero_Test) {
185 return GenerateRealFromBits<double, GeneratePositiveTag, true>(
a);
188 EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
189 EXPECT_EQ(ToDouble(0x0000000000000001), 5.42101086242752217004e-20);
190 EXPECT_EQ(ToDouble(0x8000000000000000), 0.5);
191 EXPECT_EQ(ToDouble(0x8000000000000001), 0.5);
192 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), 0.999999999999999888978);
195 TEST(GenerateRealTest, U64ToDouble_Negative_NoZero_Test) {
197 return GenerateRealFromBits<double, GenerateNegativeTag, false>(
a);
200 EXPECT_EQ(ToDouble(0x0000000000000000), -2.710505431213761085e-20);
201 EXPECT_EQ(ToDouble(0x0000000000000001), -5.42101086242752217004e-20);
202 EXPECT_EQ(ToDouble(0x0000000000000002), -1.084202172485504434e-19);
203 EXPECT_EQ(ToDouble(0x8000000000000000), -0.5);
204 EXPECT_EQ(ToDouble(0x8000000000000001), -0.5);
205 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
208 TEST(GenerateRealTest, U64ToDouble_Negative_Zero_Test) {
210 return GenerateRealFromBits<double, GenerateNegativeTag, true>(
a);
213 EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
214 EXPECT_EQ(ToDouble(0x0000000000000001), -5.42101086242752217004e-20);
215 EXPECT_EQ(ToDouble(0x0000000000000002), -1.084202172485504434e-19);
216 EXPECT_EQ(ToDouble(0x8000000000000000), -0.5);
217 EXPECT_EQ(ToDouble(0x8000000000000001), -0.5);
218 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
221 TEST(GenerateRealTest, U64ToDouble_Signed_NoZero_Test) {
223 return GenerateRealFromBits<double, GenerateSignedTag, false>(
a);
226 EXPECT_EQ(ToDouble(0x0000000000000000), 5.42101086242752217004e-20);
227 EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19);
228 EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), 0.999999999999999888978);
229 EXPECT_EQ(ToDouble(0x8000000000000000), -5.42101086242752217004e-20);
230 EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19);
231 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
234 TEST(GenerateRealTest, U64ToDouble_Signed_Zero_Test) {
236 return GenerateRealFromBits<double, GenerateSignedTag, true>(
a);
238 EXPECT_EQ(ToDouble(0x0000000000000000), 0);
239 EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19);
240 EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), 0.999999999999999888978);
241 EXPECT_EQ(ToDouble(0x8000000000000000), 0);
242 EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19);
243 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978);
246 TEST(GenerateRealTest, U64ToDouble_GenerateSignedTag_Bias_Test) {
248 return GenerateRealFromBits<double, GenerateSignedTag, true>(
a, -1);
250 EXPECT_EQ(ToDouble(0x0000000000000000), 0);
251 EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19 / 2);
252 EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), 0.999999999999999888978 / 2);
253 EXPECT_EQ(ToDouble(0x8000000000000000), 0);
254 EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19 / 2);
255 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), -0.999999999999999888978 / 2);
258 TEST(GenerateRealTest, U64ToDoubleTest) {
260 return GenerateRealFromBits<double, GeneratePositiveTag, true>(
a);
263 EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
264 EXPECT_EQ(ToDouble(0x0000000000000000), 0.0);
266 EXPECT_EQ(ToDouble(0x0000000000000001), 5.42101086242752217004e-20);
267 EXPECT_EQ(ToDouble(0x7fffffffffffffef), 0.499999999999999944489);
268 EXPECT_EQ(ToDouble(0x8000000000000000), 0.5);
271 EXPECT_EQ(ToDouble(0x8000000000000001), 0.5);
272 EXPECT_EQ(ToDouble(0x80000000000007FF), 0.5);
273 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), 0.999999999999999888978);
274 EXPECT_NE(ToDouble(0x7FFFFFFFFFFFF800), ToDouble(0x7FFFFFFFFFFFF7FF));
276 EXPECT_LT(ToDouble(0xFFFFFFFFFFFFFFFF), 1.0);
277 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFF), ToDouble(0xFFFFFFFFFFFFF800));
278 EXPECT_NE(ToDouble(0xFFFFFFFFFFFFFFFF), ToDouble(0xFFFFFFFFFFFFF7FF));
279 EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFFC00));
280 EXPECT_NE(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFFBFF));
281 EXPECT_EQ(ToDouble(0x3FFFFFFFFFFFFFFF), ToDouble(0x3FFFFFFFFFFFFE00));
282 EXPECT_NE(ToDouble(0x3FFFFFFFFFFFFFFF), ToDouble(0x3FFFFFFFFFFFFDFF));
284 EXPECT_EQ(ToDouble(0x1000000000000001), 0.0625);
285 EXPECT_EQ(ToDouble(0x2000000000000001), 0.125);
286 EXPECT_EQ(ToDouble(0x3000000000000001), 0.1875);
287 EXPECT_EQ(ToDouble(0x4000000000000001), 0.25);
288 EXPECT_EQ(ToDouble(0x5000000000000001), 0.3125);
289 EXPECT_EQ(ToDouble(0x6000000000000001), 0.375);
290 EXPECT_EQ(ToDouble(0x7000000000000001), 0.4375);
291 EXPECT_EQ(ToDouble(0x8000000000000001), 0.5);
292 EXPECT_EQ(ToDouble(0x9000000000000001), 0.5625);
293 EXPECT_EQ(ToDouble(0xa000000000000001), 0.625);
294 EXPECT_EQ(ToDouble(0xb000000000000001), 0.6875);
295 EXPECT_EQ(ToDouble(0xc000000000000001), 0.75);
296 EXPECT_EQ(ToDouble(0xd000000000000001), 0.8125);
297 EXPECT_EQ(ToDouble(0xe000000000000001), 0.875);
298 EXPECT_EQ(ToDouble(0xf000000000000001), 0.9375);
304 EXPECT_NE(
static_cast<int64_t>(ToDouble(0xFFFFFFFFFFFFFFFF) * two_to_53 * 2),
309 for (
int i = 0;
i < 100; ++
i) {
310 EXPECT_EQ(
i * ToDouble(0x0000000000000001), ToDouble(
i));
314 double exp_values[64];
315 exp_values[63] = 0.5;
316 for (
int i = 62;
i >= 0; --
i) exp_values[
i] = 0.5 * exp_values[
i + 1];
318 for (
int i = 0;
i < 64; ++
i) {
320 for (
int j = 1;
j < DBL_MANT_DIG &&
i -
j >= 0; ++
j) {
321 EXPECT_NE(exp_values[
i] + exp_values[
i - j], exp_values[
i]);
323 exp_values[
i] + exp_values[
i - j]);
325 for (
int j = DBL_MANT_DIG;
i -
j >= 0; ++
j) {
326 EXPECT_EQ(exp_values[
i] + exp_values[
i - j], exp_values[
i]);
327 EXPECT_EQ(ToDouble((one <<
i) + (one << (
i - j))), exp_values[
i]);
332 TEST(GenerateRealTest, U64ToDoubleSignedTest) {
334 return GenerateRealFromBits<double, GenerateSignedTag, false>(
a);
337 EXPECT_EQ(ToDouble(0x0000000000000000), 5.42101086242752217004e-20);
338 EXPECT_EQ(ToDouble(0x0000000000000001), 1.084202172485504434e-19);
340 EXPECT_EQ(ToDouble(0x8000000000000000), -5.42101086242752217004e-20);
341 EXPECT_EQ(ToDouble(0x8000000000000001), -1.084202172485504434e-19);
343 const double e_plus = ToDouble(0x0000000000000001);
344 const double e_minus = ToDouble(0x8000000000000001);
345 EXPECT_EQ(e_plus, 1.084202172485504434e-19);
346 EXPECT_EQ(e_minus, -1.084202172485504434e-19);
348 EXPECT_EQ(ToDouble(0x3fffffffffffffef), 0.499999999999999944489);
349 EXPECT_EQ(ToDouble(0xbfffffffffffffef), -0.499999999999999944489);
352 EXPECT_EQ(ToDouble(0x4000000000000000), 0.5);
353 EXPECT_EQ(ToDouble(0x4000000000000001), 0.5);
354 EXPECT_EQ(ToDouble(0x40000000000003FF), 0.5);
356 EXPECT_EQ(ToDouble(0xC000000000000000), -0.5);
357 EXPECT_EQ(ToDouble(0xC000000000000001), -0.5);
358 EXPECT_EQ(ToDouble(0xC0000000000003FF), -0.5);
360 EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFe), 0.999999999999999888978);
361 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFe), -0.999999999999999888978);
363 EXPECT_NE(ToDouble(0x7FFFFFFFFFFFF800), ToDouble(0x7FFFFFFFFFFFF7FF));
365 EXPECT_LT(ToDouble(0x7FFFFFFFFFFFFFFF), 1.0);
366 EXPECT_GT(ToDouble(0x7FFFFFFFFFFFFFFF), 0.9999999999);
368 EXPECT_GT(ToDouble(0xFFFFFFFFFFFFFFFe), -1.0);
369 EXPECT_LT(ToDouble(0xFFFFFFFFFFFFFFFe), -0.999999999);
371 EXPECT_EQ(ToDouble(0xFFFFFFFFFFFFFFFe), ToDouble(0xFFFFFFFFFFFFFC00));
372 EXPECT_EQ(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFFC00));
373 EXPECT_NE(ToDouble(0xFFFFFFFFFFFFFFFe), ToDouble(0xFFFFFFFFFFFFF3FF));
374 EXPECT_NE(ToDouble(0x7FFFFFFFFFFFFFFF), ToDouble(0x7FFFFFFFFFFFF3FF));
376 EXPECT_EQ(ToDouble(0x1000000000000001), 0.125);
377 EXPECT_EQ(ToDouble(0x2000000000000001), 0.25);
378 EXPECT_EQ(ToDouble(0x3000000000000001), 0.375);
379 EXPECT_EQ(ToDouble(0x4000000000000001), 0.5);
380 EXPECT_EQ(ToDouble(0x5000000000000001), 0.625);
381 EXPECT_EQ(ToDouble(0x6000000000000001), 0.75);
382 EXPECT_EQ(ToDouble(0x7000000000000001), 0.875);
383 EXPECT_EQ(ToDouble(0x7800000000000001), 0.9375);
384 EXPECT_EQ(ToDouble(0x7c00000000000001), 0.96875);
385 EXPECT_EQ(ToDouble(0x7e00000000000001), 0.984375);
386 EXPECT_EQ(ToDouble(0x7f00000000000001), 0.9921875);
389 EXPECT_EQ(ToDouble(0x9000000000000001), -0.125);
390 EXPECT_EQ(ToDouble(0xa000000000000001), -0.25);
391 EXPECT_EQ(ToDouble(0xb000000000000001), -0.375);
392 EXPECT_EQ(ToDouble(0xc000000000000001), -0.5);
393 EXPECT_EQ(ToDouble(0xd000000000000001), -0.625);
394 EXPECT_EQ(ToDouble(0xe000000000000001), -0.75);
395 EXPECT_EQ(ToDouble(0xf000000000000001), -0.875);
404 EXPECT_NE(
static_cast<int64_t>(ToDouble(0x7FFFFFFFFFFFFFFF) * two_to_53 * 2),
409 for (
int i = 1;
i < 100; ++
i) {
411 EXPECT_EQ(
i * e_minus, ToDouble(0x8000000000000000 |
i)) <<
i;
415 TEST(GenerateRealTest, ExhaustiveFloat) {
417 return GenerateRealFromBits<float, GeneratePositiveTag, true>(
a);
428 float last_f = 1.0, last_g = 2.0;
429 uint64_t f_collisions = 0, g_collisions = 0;
430 uint64_t f_unique = 0, g_unique = 0;
432 auto count = [&](
const float r) {
435 const float f = 0.0f * (1.0f -
r) + 1.0
f *
r;
443 const float g = 1.0f * (1.0f -
r) + 2.0
f *
r;
457 for (;
x != 0 && limit > 0;) {
458 constexpr
int kDig = (64 - FLT_MANT_DIG);
468 dec <<= (kDig - clz);
471 for (;
x > chk && limit > 0;
x -= dec) {
477 static_assert(FLT_MANT_DIG == 24,
478 "The float type is expected to have a 24 bit mantissa.");
486 EXPECT_EQ((1 << 24) + 40 * (1 << 23) - 1, f_unique);