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

虽然在底层编译器可能对`fabs`和条件否定做相同的事,但在处理浮点数的特殊情况如无穷大、非数字(NaN)、负零时,直接使用`abs`或`fabs`可能更为简洁。代码示例显示,`func1`使用`std::abs`在Clang和g++编译器下生成的代码更简洁,而`func2`的条件表达式导致了更复杂的指令。在某些情况下,`func2`的实现可能会因为隐含的if导致更慢的执行速度。
摘要由CSDN通过智能技术生成

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

但是,至少对于浮点数,如果要处理无穷大,非数字(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: # @_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值