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

时间:2011-10-02 22:55:50

标签: c#

我有这个等式:

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

previous_valval5是与其他值相等的局部变量。变量hms代表小时,分钟和秒。

我的问题:当ms都等于0时,我得到NaN而不是我的答案。 NaNh相当于0时,也实现了m

我应该在我的代码中添加什么才会引发异常?我确信这个'不是数字'“错误”的原因是我将其除以零。

3 个答案:

答案 0 :(得分:5)

NaN易于生产:

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

hms中的零如何/可以导致这种情况?请记住,一旦引入了NaN,它就会在大多数情况下无声地传播。 (正如其他人所建议的那样,将问题分解成更小的一小部分将有助于调试 - 以及未来的可维护性; - )

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

快乐的编码。


虽然[标准] 浮点操作不会抛出异常(因为NaN 被编码为浮点值),整数< / em>数学运算可能会抛出异常(因为NaN未编码)。如果操作是整数数学就足够了,那么它可以用来“抛出”异常:

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

答案 1 :(得分:1)

浮点运算不会抛出异常。除以零显然不会产生有效答案,因此您应该在进行计算之前检查此方案。

答案 2 :(得分:-2)

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

  2. 如果可能,请包含“try / catch(DivideByZeroException ex)”块。

  3. 最重要的是,如果可能的话,在“双”(或“浮动”)空间进行arimemetic(例如“24.0”而不是“24”)。