Skip to content

Commit 073d72f

Browse files
committed
Fix the uniform_all random generator
- It always produced 'inf' because the range was greater than mt19937_64's limit - It makes more sense to use a logscale to better cover the range of possible floating values: uniform_all -> logspace_all
1 parent 68323b9 commit 073d72f

File tree

3 files changed

+34
-19
lines changed

3 files changed

+34
-19
lines changed

benchmarks/benchmark.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ int main(int argc, char **argv) {
375375
fmt::println(" ./benchmark --file=data/canada.txt # Run benchmark using numbers from a file");
376376
fmt::println(" ./benchmark --fixed=10 # Test fixed-point representation instead of shortest length");
377377
fmt::println(" ./benchmark --test # Test correctness instead of performance");
378-
fmt::println(" ./benchmark --volume=1000 --model=uniform # Generate 1000 uniform random numbers");
378+
fmt::println(" ./benchmark --volume=1000 --model=uniform_01 # Generate 1000 uniform random numbers in [0, 1]");
379379
fmt::println(" ./benchmark --algo-filter=ryu,grisu # Only test algorithms containing 'ryu' or 'grisu'");
380380
fmt::println("\nFor full options list, run: ./benchmark --help");
381381
return EXIT_FAILURE;

benchmarks/random_generators.h

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ struct uniform_generator : float_number_generator<T> {
3030
T new_float() override { return dis(gen); }
3131
};
3232

33+
template <typename T>
34+
struct logspace_generator : float_number_generator<T> {
35+
std::random_device rd;
36+
std::mt19937_64 gen;
37+
std::uniform_int_distribution<int> exp;
38+
std::uniform_real_distribution<T> significand;
39+
explicit logspace_generator()
40+
: rd(), gen(rd()),
41+
exp(std::numeric_limits<T>::min_exponent + 1, // +1 skips subnormals
42+
std::numeric_limits<T>::max_exponent),
43+
significand(-1, 1) {}
44+
std::string describe() override {
45+
return "Generate random numbers uniformly in log2 space, i.e. "
46+
"magnitudes uniformly distributed in the interval [-2^max_exponent, 2^max_exponent]";
47+
}
48+
T new_float() override { return significand(gen) * std::pow(2.0, exp(gen)); }
49+
};
50+
3351
enum centering { centered, non_centered };
3452
template <std::floating_point T, centering C>
3553
struct centered_generator : float_number_generator<T> {
@@ -112,29 +130,26 @@ struct one_over_rand : float_number_generator<T> {
112130
};
113131

114132
constexpr std::array<const char*, 8> model_names = {
115-
"uniform_01" , "uniform_all" , "integer_uniform" ,
116-
"centered" , "non_centered" ,
117-
"simple_uniform" , "simple_int" ,
118-
"one_over_rand"
133+
"uniform_01" , "logspace_all" ,
134+
"centered" , "non_centered" ,
135+
"simple_uniform" , "simple_int" ,
136+
"one_over_rand" , "integer_uniform" ,
119137
};
120138

121139
template <typename T>
122140
inline std::unique_ptr<float_number_generator<T>>
123-
get_generator_by_name(std::string name) {
141+
get_generator_by_name(const std::string name) {
124142
std::cout << "available models (-m): ";
125-
for (std::string name : model_names) {
126-
std::cout << name << " ";
143+
for (const auto& model : model_names) {
144+
std::cout << model << " ";
127145
}
128146
std::cout << std::endl;
129147

130148
// This is naive, but also not very important.
131149
if (name == "uniform_01")
132150
return std::unique_ptr<float_number_generator<T>>(new uniform_generator<T>());
133-
if (name == "uniform_all") {
134-
return std::unique_ptr<float_number_generator<T>>(
135-
new uniform_generator<T>(std::numeric_limits<T>::lowest(),
136-
std::numeric_limits<T>::max())
137-
);
151+
if (name == "logspace_all") {
152+
return std::unique_ptr<float_number_generator<T>>(new logspace_generator<T>());
138153
}
139154
if (name == "centered")
140155
return std::unique_ptr<float_number_generator<T>>(new centered_generator<T, centered>());

scripts/generate_multiple_tables.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
]
1515
models = [
1616
'uniform_01',
17-
'uniform_all',
18-
'integer_uniform',
19-
'centered',
20-
'non_centered',
17+
# 'logspace_all',
18+
# 'integer_uniform',
19+
# 'centered',
20+
# 'non_centered',
2121
]
22-
runs_r = 1_000
23-
volume_v = 1_000_000
22+
runs_r = 100
23+
volume_v = 100_000
2424
flag_combinations = [
2525
[],
2626
['-F6'],

0 commit comments

Comments
 (0)