相关疑难解决方法(0)

浮点乘以零是否保证产生零?

我知道浮点数有舍入错误,但我想知道是否存在某些错误不适用的情况,例如乘以零.

对于所有浮点,任何数字的零次是否为零?

c c++ floating-point

16
推荐指数
1
解决办法
4658
查看次数

当两个std :: complex相乘时,为什么要调用__muldc3?

我天真地假设,编译器将内联复数乘法,例如对于此函数:

#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)

c++ optimization gcc complex-numbers

4
推荐指数
1
解决办法
492
查看次数

标签 统计

c++ ×2

c ×1

complex-numbers ×1

floating-point ×1

gcc ×1

optimization ×1