|
Boost : |
Subject: Re: [boost] [math] Comeau can't match math::tools::fmod_workaround
From: Mateusz Loskot (mateusz_at_[hidden])
Date: 2009-11-27 15:05:16
John Maddock wrote:
>> Could any one confirm if it is an error indeed?
>
> These all look to be related, and indicate a genuine issue:
>
> fabs(long_double_value)
>
> is returning a double (ie truncated) result :-(
>
> Can you confirm whether #include <cmath> results in fabs(long double)
> being defined?
John,
I made quick test and it looks std::fabs(long double) is missing:
$ cat long_double_fabs.cpp
#include <cmath>
template <typename T>
T foo(T a, T b) { return a + b; }
int main()
{
long double a = -1.23;
long double b = std::fabs(a); // compiles
foo( std::fabs(a), b ); // does not compile
}
$ como --strict --c++ long_double_fabs.cpp
Comeau C/C++ 4.3.10.1 (May 7 2008 12:23:21) for LINUX_INTEL_ELF_Beta
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ noC++0x_extensions
"long_double_fabs.cpp", line 11: error: no instance of function template
"foo"
matches the argument list
argument types are: (double, long double)
foo( std::fabs(a), b ); // does not compile
^
1 error detected in the compilation of "long_double_fabs.cpp".
The <cmath> comes from libcomo library:
/opt/libcomo36/include/cnames/cmath
and it includes <math.h> from GNU C Library.
I generated raw listing (preprocessed, etc.) and it looks that
actual definition of fabs being used comes from GNU C Library and
it truncates input argument to double:
/* Absolute value of X. */
__MATHCALLX (fabs,, (_Mdouble_ __x), (__const__));
It may look like Comeau/libcomo issue, as long double fabs(long double)
should be well defined so the simple template test above is supposed to
work. Am I correct?
Best regards,
-- Mateusz Loskot, http://mateusz.loskot.net Charter Member of OSGeo, http://osgeo.org
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk