#include #include const unsigned short prec_mask = 0x0300; const unsigned short prec_64 = 0x0300; const unsigned short prec_53 = 0x0200; const unsigned short prec_24 = 0x0100; void print (const char* str, const double d) { union { double dbl; void* ptr; } mix; mix.dbl = d; std::cout.precision(40); std::cout << str << "(" << mix.ptr << ") " << mix.dbl << "\n"; } unsigned short get_fpu_control_word() { unsigned short cw; __asm__ ("fnstcw %0" : "=m" (*&cw)); std::cout << "CW: " << std::hex << cw << std::dec << "\n"; return cw; } void reset_fpu_control_word (unsigned short prec) { unsigned short cw = get_fpu_control_word(); cw &= ~prec_mask; cw |= prec & prec_mask; __asm__ ("fldcw %0" : : "m" (*&cw)); (void)get_fpu_control_word(); } void convert_str (const char* ptr) { const double d_cast = boost::lexical_cast(ptr); const double d_atof = std::atof(ptr); std::istringstream strm(ptr); double d_strm(0.0); strm >> d_strm; std::cout << std::endl; std::cout << "str: " << ptr << "\n"; if (d_cast != d_atof || d_cast != d_strm) std::cout << "DIFFERENT!\n"; print ("boost::lexical_cast: ", d_cast); print ("std::atof: ", d_atof); print ("std::istringstream: ", d_strm); std::cout << std::endl; } int main() { reset_fpu_control_word(prec_53); convert_str("-15352.00000000000"); convert_str("153520000000000000000000"); convert_str("1.535200000000000e+04"); convert_str("4.932812500000000e+03"); convert_str("4.932812500000000e+02"); convert_str("4.932812500000000e+01"); convert_str("49328125.00000000"); convert_str("-1.600000000000001421"); convert_str("-3.200000000000000178"); return 0; }