Matlab如何获取小于指定值的最大浮点数?
嘿,这个问题我刚好有经验!你已经知道用x + eps(x)获取比x大的最小浮点数,那要找比x小的最大浮点数,其实有两种靠谱的方法:
1. 优先用内置函数 prevfloat(x)
从Matlab R2016b版本开始,官方提供了prevfloat这个专门的函数,它直接返回比输入值x小的最大浮点数,用法超级简单:
x = 3.14; smaller_x = prevfloat(x); % 得到比3.14小的最接近浮点数
对应的,还有nextfloat(x)函数,用来返回比x大的最小浮点数——它比手动计算x + eps(x)更鲁棒,能正确处理Inf、NaN、0这些特殊值。比如prevfloat(0)会返回-realmin(最小的负浮点数),nextfloat(0)则返回realmin(最小的正浮点数)。
2. 旧版本Matlab的手动实现
如果你的Matlab版本太老,没有prevfloat,可以根据浮点数的特性手动计算,分三种情况处理:
- 当
x是正数时:比x小的最大浮点数是x - eps(x),因为eps(x)本身就是x到下一个更大浮点数的距离,反过来减这个距离就能得到前一个更小的数。 - 当
x是负数时:浮点数的分布是对称的,比负数x小的最大浮点数等价于-nextfloat(-x)(先取x的绝对值,找比它大的最小浮点数,再取相反数),或者直接写x - eps(abs(x))也可以。 - 当
x是0时:比0小的最大浮点数是-realmin(Matlab里能表示的最小负浮点数)。
对应的手动实现函数可以这样写:
function y = my_prevfloat(x) if x > 0 y = x - eps(x); elseif x < 0 y = -my_nextfloat(-x); else % x == 0 y = -realmin; end end function y = my_nextfloat(x) if x >= 0 y = x + eps(x); else y = -my_prevfloat(-x); end end
你可以测试一下,比如my_prevfloat(1)会返回1 - eps(1),和prevfloat(1)的结果完全一致,my_prevfloat(-2)也会正确返回比-2小的最接近浮点数。
内容的提问来源于stack exchange,提问作者FalafelPita
相关产品推荐
相关产品推荐

