【问题标题】:Floating Point Number Overflow [duplicate]浮点数溢出[重复]
【发布时间】:2015-10-08 15:05:36
【问题描述】:

我必须创建一个需要平方值的函数。有人告诉我,即使初始值不太大或不太小,平方值仍可能溢出(返回inf)或下溢(返回0),我需要弄清楚如何防止这种情况发生.

我的问题是,当数字本身不太大时,我什至不明白在平方时哪些数字会导致溢出。

我认为这可能适用于不太小的数字,例如1/3 带有重复的十进制数字,但 MATLAB 只是将其转换为 0.3333

谁能给我一个这样的数字的例子或解释什么样的数字会导致这种情况?

【问题讨论】:

  • nsingle = realmax('double') 返回最大的正浮点数。

标签: matlab floating-point


【解决方案1】:

对于下溢,让我们考虑普朗克常数:6.626070040e-34

sqrt(6.626070040e-34)
ans =
   2.5741e-17

嗯,这显然不够小,让我们变小:

sqrt(6.626070040e-340)
ans =
     0

这是你的下溢。

溢出也可以这样看,只是使用大数字:

sqrt(6.626070040e34)
ans =
   2.5741e+17

sqrt(6.626070040e340)
ans =
   Inf

下溢表示数字太小,MATLAB 无法处理,上溢表示数字太大,MATLAB 无法处理。

感谢@obchardon,这里是我的 MATLAB R2012a 64 位系统上的数字:

realmax('double') %//largest allowed double
ans =
  1.7977e+308
realmin('double') %//smallest allowed double
ans =
  2.2251e-308

现在我们知道 MATLAB 可以处理的最大可能值是多少,让我们尝试低于该值并求平方:

(realmax('double')-10).^2
ans =
   Inf

所以我们在这里尝试平方的数字 (realmax('double')-10) 是 MATLAB 允许的,但不能平方。

【讨论】:

  • 技术上realmin 只是最小的规范化 double。例如eps(realmin),返回一个小于realmin的数字...
  • 等等,我正在做的问题的一部分是这样说的“即使一个数字不是太大,它的平方也可能溢出”你作为例子给出的数字不是太大了?
  • sqrt(realmax('double')+1) 在这里工作,sqrt(realmax('double')-1) 也是如此。您可以尝试遍历数字以查看确切的限制在哪里。
  • 所以没有任何特殊的小数(小位数)该数字的平方会溢出?
  • @Adriaan 我认为您不需要循环查找必须添加到realmax 以使其溢出的内容,这就是eps 所做的。试试eps(realmax)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多