为什么为“ismember”函数生成的代码包含值为“1.4013E-45F”的变量“absxk”?

3次查看(最近30天)

为“ismember”函数生成的代码包含将值1.4013E-45F赋值给变量“absxk”。这导致双数据类型中出现下溢。

为什么会生成此任务?如何避免?

公认的答案

MathWorks支金宝app持团队
将1.4013E-45F赋值给变量“absxk”可能会导致下溢。这种情况发生在不支持低于正常值的浮点数的目标上。然而,对于这样的目标,C编译器可能会抱怨低于正常值的文本无效。MATLAB语言需要IEEE浮点,并在某些情况下支持非规范浮点数。金宝app
该文本来自MATLAB eps()函数的代码生成。两个文本中较小的是eps(单个(0))。
>>每股收益(单一(0))
ans=
单一的
1.401298e-45
二者中较大者为realmin(单(0))
>>realmin('single')
ans=
单一的
1.175494e-38
1.为什么在代码中生成这个赋值?
此代码由ismember()生成的原因是,该函数正在保护自己,防止某些数据被C编译器保存在扩展精度寄存器中。在某些情况下,例如,使用一些C编译器选项,寄存器值和内存中的值可能不同,因此a~=b,如果在执行相等检查之前将寄存器中的值刷新到RAM中,则它们将相等。某些编码标准禁止浮点相等检查(例如MISRA)。因此,当abs(b-a)<=eps(a/2)时,代码确定a==b。
2如何避免这种情况?
在使用ismember()的上下文中或任何其他关于浮点数据的集合函数,请考虑数据是否真的需要是浮点。如果可以使用整数类型,则该函数将比在具有整数值的浮点量上使用ismember效率更高。如果输入是浮点整数,或其中一个小倍数是整数,即使用整数类型,如int32,但如果它生成或需要大量数据副本,则可能会禁止使用。

0评论

登录以发表评论。

更多答案(0)

下载188bet金宝搏


释放

R2018b