Boost logo

Boost :

Subject: Re: [boost] [chrono] boost::chrono::floor() and negative durations
From: Howard Hinnant (howard.hinnant_at_[hidden])
Date: 2013-11-21 15:23:12


On Nov 20, 2013, at 12:49 PM, Vicente J. Botet Escriba <vicente.botet_at_[hidden]> wrote:

> Le 20/11/13 13:45, Krzysztof Czainski a écrit :
>> Hello,
>>
>> The function boost::chrono::floor() is documented: "This function round
>> down the given parameter." Therefore I expect the assert in the following
>> program to pass, but it fails:
>>
>> #include <boost/chrono/floor.hpp>
>> #include <cassert>
>>
>> int main()
>> {
>> boost::chrono::nanoseconds const nsec( -1 );
>> boost::chrono::seconds const sec =
>> boost::chrono::floor<boost::chrono::seconds>(nsec);
>> assert( sec.count() == -1 );
>> }
>>
>> Is this intended behavior? If yes, could the docs be updated to clarify
>> this?
>>
>>
> Hi,
>
> no, there is a bug with negative numbers.
>
> template <class To, class Rep, class Period>
> To floor(const duration<Rep, Period>& d)
> {
> + if (d<duration<Rep, Period>::zero())
> + return duration_cast<To>(d)-To(1);
> + else
> return duration_cast<To>(d);
> }
>
> Please, coul dyou create a ticket so that I don't forget it.
>
> Thanks,
> Vicente
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

#include <chrono>

using namespace std::chrono;

    template <class To, class Rep, class Period>
    To floor(const duration<Rep, Period>& d)
    {
     if (d<duration<Rep, Period>::zero())
       return duration_cast<To>(d)-To(1);
     else
        return duration_cast<To>(d);
    }

#include <iostream>

int
main()
{
    using namespace std::literals;
    std::cout << floor<seconds>(-1000ms).count() << '\n';
}

For me outputs:

-2

How about this instead:

template <class To, class Rep, class Period>
To
floor(const std::chrono::duration<Rep, Period>& d)
{
    To t = std::chrono::duration_cast<To>(d);
    if (t > d)
        --t;
    return t;
}

Howard


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk