1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 
  | 
#include <iostream>
#include <limits>
int nearest_odd_integer( double v )
{
    if( v >= std::numeric_limits<int>::max() ) return std::numeric_limits<int>::max() ;
    else if( v <= std::numeric_limits<int>::min() ) return std::numeric_limits<int>::min() + 1 ;
    bool negative = false ;
    if( v < 0 ) { negative = true ; v = -v ; }
    int ival = v ; // truncation towards zero
    if( ival%2 == 0 ) ++ival ; // even, nearest odd integer is i+1
    return negative ? -ival : ival ;
}
int main()
{
    for( double d : { -1.0e+30, -2.9, -2.3, -2.0, -1.99, -0.6, -0.01, 0.0, +0.01, +0.7, +1.8, +2.0, +2.3, 1.0e+30,  } )
        std::cout << d << " => " << nearest_odd_integer(d) << '\n' ;
}
  |  |