From 4bf7fbeb9c8a46f1acd091a2acd39b417353b052 Mon Sep 17 00:00:00 2001 From: Cuda-Chen Date: Tue, 25 Jul 2023 16:08:09 +0800 Subject: [PATCH] Use SplitMix64 for seeding test cases Close #581. --- tests/impl.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tests/impl.cpp b/tests/impl.cpp index 82b58b3c..bb8dc84a 100644 --- a/tests/impl.cpp +++ b/tests/impl.cpp @@ -350,10 +350,21 @@ static inline double bankersRounding(double val) return ret; } -static float ranf(void) +// by Sebastiano Vigna, see: +static uint64_t x; +const double TWOPOWER64 = pow(2, 64); + +static double next() +{ + uint64_t z = (x += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return z ^ (z >> 31); +} + +static float ranf() { - uint32_t ir = rand() & 0x7FFF; - return (float) ir * (1.0f / 32768.0f); + return next() / TWOPOWER64; } static float ranf(float low, float high) @@ -11796,7 +11807,7 @@ SSE2NEONTestImpl::SSE2NEONTestImpl(void) mTestFloatPointer2 = (float *) platformAlignedAlloc(sizeof(__m128)); mTestIntPointer1 = (int32_t *) platformAlignedAlloc(sizeof(__m128i)); mTestIntPointer2 = (int32_t *) platformAlignedAlloc(sizeof(__m128i)); - srand(0); + x = 123456; for (uint32_t i = 0; i < MAX_TEST_VALUE; i++) { mTestFloats[i] = ranf(-100000, 100000); mTestInts[i] = (int32_t) ranf(-100000, 100000);