我知道浮点数有舍入错误,但我想知道是否存在某些错误不适用的情况,例如乘以零.
对于所有浮点,任何数字的零次是否为零?
我天真地假设,编译器将内联复数乘法,例如对于此函数:
#include <complex>
void mult(std::complex<double> &a, std::complex<double> &b){
a*=b;
}
Run Code Online (Sandbox Code Playgroud)
但是,当用gcc(带有-O2)编译时,生成的汇编器令人惊讶(至少对我而言):
mult(std::complex<double>&, std::complex<double>&):
pushq %rbx
movsd 8(%rdi), %xmm3
movsd (%rdi), %xmm2
movq %rdi, %rbx
movsd 8(%rsi), %xmm1
movsd (%rsi), %xmm0
call __muldc3
movsd %xmm0, (%rbx)
movsd %xmm1, 8(%rbx)
popq %rbx
ret
Run Code Online (Sandbox Code Playgroud)
有一个对此函数的调用,该函数__multdc3以某种方式替换了对的调用operator*=(其错误名称将是,_ZNSt7complexIdEmLIdEERS0_RKS_IT_E并且每个引用都将传递复数)。
然而,似乎是在没有什么特别实施的operator*=这可以解释的神奇:
// 26.2.5/13
// XXX: This is a grammar school implementation.
template<typename _Tp>
template<typename _Up>
complex<_Tp>&
complex<_Tp>::operator*=(const complex<_Up>& __z)
{
const _Tp __r = …Run Code Online (Sandbox Code Playgroud)