为什么我得到NaN(而不是答案)

本文关键字:答案 NaN 为什么 | 更新日期: 2023-09-27 18:10:11

我有这样一个等式:

val2 = ((((((((((Math.Pow(((previous_val) + (val5*100)), 1.001)) / 24) / 60) / 60) * 100) / 3600)*h)/m)*s));

previous_valval5是等于其他值的局部变量。hms分别代表小时、分、秒。

我的问题:当ms都等于0时,我得到的是NaN而不是我的答案。当hm等于0时,也可以实现NaN

我应该在我的代码中添加什么会抛出异常?我确信这个"非数字"错误"的原因是我除以零。

为什么我得到NaN(而不是答案)

NaN很容易产生:

float f = 0.0f / 0; // NaN (note use of fp operand to promote / to fp)
float g = f + 42;   // NaN

h, ms中的零是如何引起的?记住,一旦引入了NaN,它将在大多数情况下静默传播。(正如其他人建议的那样,将问题分解成更小的部分将有助于调试——并且可能在未来可维护性;-)

虽然最终(或中间)IsNaN检查可以检测到这种情况,但也要考虑检查/对非法输入做出反应。(我不确定是否有一种方法可以在c#中获得[罕见的]信号NaN,这与观察到的安静的NaN不同,但快速谷歌搜索说:不可能。)

幸福的编码。


虽然[standard] 浮点运算不会抛出异常(因为NaN 被编码为浮点值),但是整数数学运算可能会抛出异常(因为NaN没有被编码)。如果操作是这样的整数数学是足够的,那么它可以用来"抛出"一个异常:

int zero = 0;      // to trick compiler
int k = 42 / zero; // KABOOM! (DivideByZeroException)

浮点运算不会抛出异常。除以零显然不会得到一个有效的答案,所以你应该在计算之前检查一下这种情况。

  1. 如果可能,将此表达式简化为多个子表达式。

  2. 如果可能的话,用"try/catch (DivideByZeroException ex)"块换行。

  3. 最重要的是,如果可能的话,在"double"(或"float")空间中进行计算(例如:"24.0"代替"24")

相关文章: