2014-04-30 16 views
5

trong C++ số norm của số phức c được định nghĩa là abs(c)^2. điều này có nghĩa là re(c)^2+im(z)^2 của nó.std :: norm (std :: complex) sử dụng căn bậc hai thay vì thực hiện nhanh

này là việc thực hiện:

template<bool> 
struct _Norm_helper 
{ 
    template<typename _Tp> 
    static inline _Tp _S_do_it(const complex<_Tp>& __z) 
    { 
     const _Tp __x = __z.real(); 
     const _Tp __y = __z.imag(); 
     return __x * __x + __y * __y; 
    } 
}; 

template<> 
struct _Norm_helper<true> 
{ 
    template<typename _Tp> 
    static inline _Tp _S_do_it(const complex<_Tp>& __z) 
    { 
     _Tp __res = std::abs(__z); 
     return __res * __res; 
    } 
}; 

tại sao mọi người muốn sử dụng thi thứ hai?

cái đầu tiên rõ ràng nhanh hơn, vì nó không sử dụng abs, trong đó sqrt có liên quan.

+2

'cái đầu tiên rõ ràng là nhanh hơn' Vâng, bạn đã thực hiện kiểm tra tính thời gian để xác minh xác nhận quyền sở hữu này chưa? – PaulMcKenzie

+0

Việc triển khai không được thiết lập theo tiêu chuẩn C++. Bạn đang xem thư viện chuẩn nào? – juanchopanza

+0

tôi tìm thấy nó trong mingw, gcc 4.8.1, và tôi đã thử nghiệm nó với một mandelbrot tiêu chuẩn. – tly

Trả lời

2

Kể từ khi std :: abs chức năng có thể được chuyên biệt bởi một người sử dụng, dự kiến ​​rằng chỉ tiêu nên gọi một phiên bản chuyên ngành. Việc thực hiện sau này gọi abs của người dùng, trước đây, giả định một triển khai phổ biến.

+0

Điểm tốt, nhưng, std :: phức tạp là khá rõ ràng để * không * hữu ích cho T khác hơn float, đôi, dài gấp đôi (và tôi có thể sai về người cuối cùng :-)). Vì mã OP chỉ áp dụng cho phức tạp , có vẻ như không có nhiều điểm trong việc đưa ra một điều khoản ở đây cho một phức tạp và sau đó có std :: norm() làm việc vì std :: abs() được cung cấp cho kiểu đó . – greggo

+0

Ở đâu được xác định là không hữu ích cho các T khác? Tôi có thể tưởng tượng rất nhiều cách triển khai khác nhau của các số thực, khác với được xây dựng trong – ivg

+0

Tôi cũng có thể, không có nghĩa là std :: complex sẽ làm việc cho chúng :-). Nếu bạn tin tưởng điều này: http://en.cppreference.com/w/cpp/numeric/complex "Hiệu ứng của việc tạo ra phức tạp mẫu cho bất kỳ loại nào khác [vượt ra ngoài float, double, long double] là không xác định" – greggo

Các vấn đề liên quan