Bug 35389 - error in norm() of STL
Summary: error in norm() of STL
Status: RESOLVED DUPLICATE of bug 323
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.2.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-02-27 10:44 UTC by Y. Wei
Modified: 2008-02-27 20:38 UTC (History)
55 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
test.cpp.diff (258 bytes, text/x-diff)
2008-02-27 20:30 UTC, Pawel Sikora
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Y. Wei 2008-02-27 10:44:42 UTC
There is something wrong with the norm() in STL to get the norm2 of complex numbers.

Suppose we have complex<double> x(8,1), the norm of x should be 8*8 + 1*1 = 65, but norm(x) returns 64, which is incorrect.

If we do complex<float> x(8,1), there is no problem, norm(x) does return 65.

The issue is not limited to version 4.2.1. It is observed in other versions as well.
Comment 1 Richard Biener 2008-02-27 12:43:42 UTC
This works for me.  Please provide a testcase that fails.
Comment 2 Richard Biener 2008-02-27 12:43:57 UTC
I used:

#include <complex>
#include <algorithm>
#include <iostream>

int main()
{
  std::complex<double> x(8, 1);
  std::cout << std::norm(x) << std::endl;
}
Comment 3 Y. Wei 2008-02-27 20:13:13 UTC
Subject: RE:  error in norm() of STL

I did additional test based your test code. You are right that norm()
seems to be fine. The problem happens when I try to cast the return
double value of norm() to unsigned long long (please see my test code
below and the corresponding output). Still, it bothers me that if I
carry out the norm calculation explicitly, instead of calling norm(),
there is no such an issue.

Thanks,
- Yongbin

My test code:
=================================================================
#include <iostream>
#include <complex>

using namespace std;

main() {

   complex<double> tt(8,1);
   double x, y;
      
    x = norm(tt);
      double r = tt.real(), i = tt.imag();    
      y = r*r + i*i;

        cout << tt << "\t" << (unsigned long long)x << "\t" << (unsigned
long long)y << endl;        
        cout << tt << "\t" << x << "\t" << y << endl;
}
======================================
The output
(8,1)   64      65
(8,1)   65      65 

-----Original Message-----
From: rguenth at gcc dot gnu dot org [mailto:gcc-bugzilla@gcc.gnu.org] 
Sent: Wednesday, February 27, 2008 4:44 AM
To: Wei, Yongbin
Subject: [Bug c++/35389] error in norm() of STL



------- Comment #2 from rguenth at gcc dot gnu dot org  2008-02-27 12:43
-------
I used:

#include <complex>
#include <algorithm>
#include <iostream>

int main()
{
  std::complex<double> x(8, 1);
  std::cout << std::norm(x) << std::endl;
}


Comment 4 Pawel Sikora 2008-02-27 20:30:20 UTC
Subject: Re:  error in norm() of STL

On Wednesday 27 of February 2008 21:13:13 ywei at qualcomm dot com wrote:
> ------- Comment #3 from ywei at qualcomm dot com  2008-02-27 20:13 -------
> Subject: RE:  error in norm() of STL
>
> I did additional test based your test code. You are right that norm()
> seems to be fine. The problem happens when I try to cast the return
> double value of norm() to unsigned long long (please see my test code
> below and the corresponding output). Still, it bothers me that if I
> carry out the norm calculation explicitly, instead of calling norm(),
> there is no such an issue.
>
> Thanks,
> - Yongbin
>
> My test code:
> =================================================================
> #include <iostream>
> #include <complex>
>
> using namespace std;
>
> main() {
>
>    complex<double> tt(8,1);
>    double x, y;
>
>     x = norm(tt);
>       double r = tt.real(), i = tt.imag();
>       y = r*r + i*i;
>
>         cout << tt << "\t" << (unsigned long long)x << "\t" << (unsigned
> long long)y << endl;
>         cout << tt << "\t" << x << "\t" << y << endl;
> }
> ======================================
> The output
> (8,1)   64      65
> (8,1)   65      65

$ ./a.out
(8,1)   64      65
(8,1)   64.999999999999985789   65

(long long)64.99999 -> 64.
Comment 5 Pawel Sikora 2008-02-27 20:30:20 UTC
Created attachment 15239 [details]
test.cpp.diff
Comment 6 Andrew Pinski 2008-02-27 20:38:53 UTC
This is just the non bug with respect of percussion.

See http://gcc.gnu.org/bugs.html#nonbugs_general




*** This bug has been marked as a duplicate of 323 ***