matlab fabs能用吗,为什么使用abs()或fabs()代替条件否定?

编译器很可能在底层对两者都做同样的事情-至少是现代的胜任的编译器。

但是,至少对于浮点数,如果要处理无穷大,非数字(NaN),负零等所有特殊情况,最终会写几十行。

读取a = (a < 0)?-a:a正在获取绝对值比读取小于零的绝对值要容易。

如果编译器“愚蠢”,则可能会为a = (a < 0)?-a:a编写更糟糕的代码,因为它会强制if(即使它是隐藏的),并且可能比该处理器上的内置浮点abs指令还要糟糕( 除了特殊价值的复杂性之外)

Clang(6.0-pre-release)和gcc(4.9.2)都会为第二种情况生成WORSE代码。

我写了这个小样本:

#include

#include

extern int intval;

extern float floatval;

void func1()

{

int a = std::abs(intval);

float f = std::abs(floatval);

intval = a;

floatval = f;

}

void func2()

{

int a = intval < 0?-intval:intval;

float f = floatval < 0?-floatval:floatval;

intval = a;

floatval = f;

}

clang为func1编写以下代码:

_Z5func1v: # @_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值