- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Can someone pass this bug report to whoever handles bugs in the compiler since I have failed to find any way of reporting bugs.
Both cout << x and log(x) give wrong answers when x is declared long double. But various other functions including log10 are fine.
Here is the test program
int main()
{
{
cout << "Declaring two as double" << endl;
double two = 2;
double sqrt2 = (double)sqrt(two);
double log2 = (double)log(two);
double log10_2 = (double)log10(two);
double exp2 = (double)exp(two);
cout << "two " << two << endl;
cout << "sqrt(two) " << sqrt2 << endl;
cout << "log(two) " << log2 << endl;
cout << "log10(two) " << log10_2 << endl;
cout << "exp(two) " << exp2 << endl;
cout << endl;
}
{
cout << "Declaring two as long double" << endl;
long double two = 2;
double sqrt2 = (double)sqrt(two);
double log2 = (double)log(two);
double log10_2 = (double)log10(two);
double exp2 = (double)exp(two);
cout << "two " << two << endl;
cout << "sqrt(two) " << sqrt2 << endl;
cout << "log(two) " << log2 << endl;
cout << "log10(two) " << log10_2 << endl;
cout << "exp(two) " << exp2 << endl;
cout << endl;
}
return 0;
and here is the output
Declaring two as double
two 2
sqrt(two) 1.41421
log(two) 0.693147
log10(two) 0.30103
exp(two) 7.38906
Declaring two as long double
two 1.38893e-312
sqrt(two) 1.41421
log(two) -nan(ind)
log10(two) 0.30103
exp(two) 7.38906
This happens with both the 2018 and 2019 versions of the compiler. This is the line in the make file calling the compiler
icl -Qstd=c++17 -c -EHsc -GR -Ge -GS -Qprec -Qprec_div -nologo -Qlong_double -fp:precise $*.cpp -D__builtin_huge_val()=HUGE_VAL -D__builtin_huge_valf()=HUGE_VALF -D__builtin_nan=nan -D__builtin_nanf=nanf -D__builtin_nans=nan -D__builtin_nansf=nanf
It looks like a compiler bug rather than my error but it would be nice if anyone can assist.
Robert
- Tags:
- CC++
- Development Tools
- Intel® C++ Compiler
- Intel® Parallel Studio XE
- Intel® System Studio
- Optimization
- Parallel Computing
- Vectorization
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It's somehow related to -Qlong-double option. Can you remove /Qlong-double flag as a workaround?
Thanks,
Viet
C:\Temp\vah\testcase>icl -Qstd=c++17 -EHsc -GR -Ge -GS -Qprec -Qprec_div -nologo -Qlong_double -fp:precise test.cpp -D__builtin_huge_val()=HUGE_VAL -D__builtin_huge_valf()=HUGE_VALF -D__builtin_nan=nan -D__builtin_nanf=nanf -D__builtin_nans=nan -D__builtin_nansf=nanf
test.cpp
C:\Temp\vah\testcase>test.exe
Declaring two as double
two 2
sqrt(two) 1.41421
log(two) 0.693147
log10(two) 0.30103
exp(two) 7.38906
Declaring two as long double
two 1.29046e-312
sqrt(two) 1.41421
log(two) -nan(ind)
log10(two) 0.30103
exp(two) 7.38906
C:\Temp\vah\testcase>icl -Qstd=c++17 -EHsc -GR -Ge -GS -Qprec -Qprec_div -nologo -fp:precise test.cpp -D__builtin_huge_val()=HUGE_VAL -D__builtin_huge_valf()=HUGE_VALF -D__builtin_nan=nan -D__builtin_nanf=nanf -D__builtin_nans=nan -D__builtin_nansf=nanf
test.cpp
C:\Temp\vah\testcase>test.exe
Declaring two as double
two 2
sqrt(two) 1.41421
log(two) 0.693147
log10(two) 0.30103
exp(two) 7.38906
Declaring two as long double
two 2
sqrt(two) 1.41421
log(two) 0.693147
log10(two) 0.30103
exp(two) 7.38906
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
ICL depends on the Microsoft run-time library, which doesn't support long double except as an alias for double. -Qlong_double is documented as not supported to this extent. sqrt(), when optimized with inline instructions, should be OK even if you don't provide your own long double implementation, although there are questionable aspects. As you don't supply the required standard headers, you can't hope for the required down-casting from long double to double to happen implicitly for the run-time library functions. Examples like this may work fine in linux but not with Windows.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sorry - I didn't show the headers - these were the headers
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
One often wants to use long double in a numerical calculation involving sums of products to try to reduce round-off error. It was easy enough for me to change the code to convert back to double before taking the log, but it makes the code more complicated. Possibly I need a different version for the Windows Intel compiler and the other compilers.
But really, unless I have messed up somewhere this is a bug in the Intel compiler for Windows that needs fixing.
Robert

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page