From: <dan...@ya...> - 2002-06-05 09:30:53
|
--- Luke Dunstan <cod...@ho...> wrote: > > Hi, > > I thought I'd try building Boost 1.28.0 with Mingw GCC 3.1, and so far it > seems to work well except for part of a regression test > (libs/config/test/limits_test.cpp) involving long doubles. The following > program demonstrates the problem: > > ///// > #include <iostream> > #include <limits> > > template <class T> > void print_hex_val(T t, const char* name) > { > const unsigned char* p = (const unsigned char*)&t; > std::cout << "hex value of " << name << " is: " << std::endl; > for (unsigned int i = 0; i < sizeof(T); ++i) { > if(p[i] <= 0xF) > std::cout << "0"; > std::cout << std::hex << (int)p[i]; > } > std::cout << std::dec << std::endl; > } > > int main() > { > long double one = 1.0, zero = 0.0, inf = one / zero; > _iec559_consts<long double>::_rep oldconst = { 0, 0, 0, 0x8000, 0x7fff }; > > print_hex_val(inf, "long double infinity"); > print_hex_val(oldconst.ldouble_val, "{ 0, 0, 0, 0x8000, 0x7fff }"); > print_hex_val(std::numeric_limits<long double>::infinity(), "numeric > limits"); > print_hex_val(_iec559_consts<long double>::_S_InfL.ldouble_val, > "iec559.ldouble_val"); > print_hex_val(_iec559_consts<long double>::_S_InfL.double_val, > "iec559.double_val"); > > return 0; > } > ///// > > The output is: > > hex value of long double infinity is: > 0000000000000080ff7f0000 > hex value of { 0, 0, 0, 0x8000, 0x7fff } is: > 0000000000000080ff7f0000 > hex value of numeric limits is: > 000000000000000000800000 > hex value of iec559.ldouble_val is: > 0000000000000080ff7f0000 > hex value of iec559.double_val is: > 0000000000000080 > > > It is caused by a bug in the header > libstdc++/config/os/mingw32/bits/cpu-limits.h of GCC: > > --- cpu_limits.h.old Wed Jun 5 12:08:19 2002 > +++ cpu_limits.h Wed Jun 5 12:10:01 2002 > @@ -180,13 +180,13 @@ > #define __glibcpp_long_double_has_denorm denorm_present > #define __glibcpp_long_double_has_denorm_loss true > #define __glibcpp_long_double_infinity \ > - _iec559_consts<bool>::_S_InfL.double_val > + _iec559_consts<bool>::_S_InfL.ldouble_val > #define __glibcpp_long_double_quiet_NaN \ > - _iec559_consts<bool>::_S_QNaNL.double_val > + _iec559_consts<bool>::_S_QNaNL.ldouble_val > #define __glibcpp_long_double_signaling_NaN \ > - _iec559_consts<bool>::_S_SNaNL.double_val > + _iec559_consts<bool>::_S_SNaNL.ldouble_val > #define __glibcpp_long_double_denorm_min \ > - _iec559_consts<bool>::_S_DenormL.double_val > + _iec559_consts<bool>::_S_DenormL.ldouble_val > #define __glibcpp_long_double_is_iec559 true > #define __glibcpp_long_double_is_bounded true > #define __glibcpp_long_double_is_modulo false > > > Looks like a copy & paste typo :) > Thanks! I had that fixed in my local swamp but forgot to apply to the distro version. Danny Luke Dunstan > > > _______________________________________________________________ > > Don't miss the 2002 Sprint PCS Application Developer's Conference > August 25-28 in Las Vegas -- http://devcon.sprintpcs.com/adp/index.cfm > > _______________________________________________ > MinGW-users mailing list > Min...@li... > > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users http://www.sold.com.au - The Sold.com.au Big Brand Sale - New PCs, notebooks, digital cameras, phones and more ... Sale ends June 12 |