float getval(std::vector<float> &sample, std::vector<float> &grid, float val01)
{
    size_t count = grid.size() - 1, step, c1 = 0, c2 = 0;
    float f1, f2, n = sample.size(); 
    std::vector<float>::iterator first = grid.begin(), it;
    while(count > 0)
    {
        it = first;  step = count / 2;  std::advance(it, step); 
	c1 = std::count_if(sample.begin(), sample.end(), 
			[&it](const float &v){ return v < *it;});
        c2 = std::count_if(sample.begin(), sample.end(), 
			[&it](const float &v){ return v < *(it + 1);});
        f1 = c1/n; f2 = c2/n;
        if(val01 > f1 && val01 < f2)
            break;
        if(f1 < val01)
        {
            first = ++it;
            count -= step + 1; 
        }
        else
            count = step;
    }    
    // Обработка исключительного случая равенства с1 и с2  
    // доступна в открытом репозитории [13] сервиса GitHub
    return *it + (val01 - f1) * (*(it + 1) - *it) / (f2 - f1);
}