/* * The MIT License * * Wavefront Alignment Algorithms * Copyright (c) 2017 by Santiago Marco-Sola * * This file is part of Wavefront Alignment Algorithms. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * PROJECT: Wavefront Alignment Algorithms * AUTHOR(S): Santiago Marco-Sola * DESCRIPTION: Common functions/utilities and headers for C development */ #include "commons.h" /* * Random number generator [min,max) */ uint64_t rand_iid( const uint64_t min, const uint64_t max) { const int n_rand = rand(); // [0, RAND_MAX] const uint64_t range = max - min; const uint64_t rem = RAND_MAX % range; const uint64_t sample = RAND_MAX / range; // Consider the small interval within remainder of RAND_MAX if (n_rand < RAND_MAX - rem) { return min + n_rand/sample; } else { return rand_iid(min,max); } } /* * Math */ uint32_t nominal_prop_u32( const uint32_t base, const double factor) { if (0.0 <= factor && factor <= 1.0) { return (uint32_t)((double)base*factor); } else { return (uint32_t)factor; } } uint64_t nominal_prop_u64( const uint64_t base, const double factor) { if (0.0 <= factor && factor <= 1.0) { return (uint64_t)((double)base*factor); } else { return (uint64_t)factor; } }