Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

boost::lexical_cast and double -- strange behavior

Tags:

c++

boost

Why does the following code gives me the different results when I write "2.01" and "2.02"?

#include <boost/lexical_cast.hpp>

#include <iostream>
#include <string>

int main()
{
  const std::string str = "2.02";

  try
  {
    const double b = boost::lexical_cast<double>(str) * 100.0;
    std::cout << "double: " << b << '\n';
    const int a = boost::lexical_cast<int>(b);
    std::cout << "int: " << a << '\n';
  }
  catch (const std::exception& ex)
  {
    std::cerr << ex.what() << '\n';
  }
}

Output

double: 202
int: 202

But if I change "2.02" to the "2.01" it gives me the following output:

double: 201
bad lexical cast: source type value could not be interpreted as target

Why?

I'm using Visual Studio 2013 (msvc-12.0) and boost 1.57.

Thanks in advance.

like image 655
FrozenHeart Avatar asked Oct 31 '22 10:10

FrozenHeart


1 Answers

It's floating point inaccuracy.

There's no exact representation of 2.01 in binary floating point so, multiplying by 100 doesn't result in an integer number.

You can make it visible: Live On Coliru

std::cout << "double: " << std::setprecision(18) << std::fixed << b << '\n';

Prints

double: 200.999999999999971578

Conversion to int fails for this reason.

like image 189
sehe Avatar answered Nov 04 '22 07:11

sehe