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