Matlab 为什么eps与realmax一起使用时会在矩阵中失败

Matlab 为什么eps与realmax一起使用时会在矩阵中失败,matlab,double,precision,Matlab,Double,Precision,看 但是, >> eps([1 2 0.00001; (realmax('double')-10) realmin('double') realmax('single')]) ans = 1.192093e-07 2.384186e-07 9.094947e-13 NaN 1.401298e-45 2.028241e+31 我希望示例1中的NaN从示例2中获取答案值。问题在于,当您创建以下数组时: >> ep

但是,

>> eps([1 2 0.00001; (realmax('double')-10) realmin('double') realmax('single')])

ans =

    1.192093e-07    2.384186e-07    9.094947e-13
             NaN    1.401298e-45    2.028241e+31

我希望示例1中的
NaN
从示例2中获取答案值。

问题在于,当您创建以下数组时:

>> eps(realmax('double') - 10)

ans =

     1.99584030953472e+292
第一个条目是无穷大,根据定义,
eps(Inf)=NaN

为什么会发生这种情况,
realmax('single')
返回一个单精度数字,
realmax('double')
返回一个双精度数字

REALMAX('single')
返回中最大的有限浮点数 IEEE单精度

当您将两者连接在一起时,MATLAB将成为一个
单个
精度数字,这显然会导致
realmax('double')-10
超出数据类型的范围,并且它将变为无穷大

[(realmax('double')-10) realmin('double') realmax('single')]
%//    Inf    0    3.402823e+38

当您单独调用
eps(realmin('double')-10)
时,非常大的
double
实际上是一个
double
,并且
eps
返回预期的epsilon。

准确地说,我不知道
realmin
realmax
不返回双值。给出了串联转换表。一种可能的情况似乎是,由于后来添加了非双精度类型以用于特定用途,因此Matlab假定创建非双精度数组是出于特定目的,并且应该保持创建时的非双精度类型,而不管任何涉及双精度的操作。这在某种程度上是有道理的@Alex@TroyHaskin谢谢你的信息!我已经被它咬了很多次了,尤其是在尝试连接整数和双精度时。我觉得在执行连接时应该(至少)有一个警告。
class(realmax('double'))
%// double

class(realmax('single'))
%// single

class([(realmax('double')-10) realmin('double') realmax('single')])
%// single