2011-10-02 63 views
-2

我有这样的公式:为什么我得到NaN(而不是答案)?

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

previous_valval5是等于其他值的局部变量。变量h,ms表示小时,分钟和秒。

我的问题:当两个,ms,都等于0,我得到一个NaN而不是我的答案。 NaN也实现了当hm分别相当于0

我应该添加到我的代码,将抛出一个异常?我相信,这个“不是数字”的错误的原因是我除以零。

+6

你真的应该把它分成多行....'NaN'是'不是数字'。 '不是答案'就是'NaA' –

+8

也许这是NaQ? –

+0

这就是为什么我喜欢注释xD –

回答

5

阿楠容易产生:

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

怎么办/能在hm,并s造成的零?请记住,一旦引入了NaN,它将在大多数情况下默默传播。 (正如其他人建议,打破了问题成更小的一口大小的部分将在助手调试 - 和未来可能的可维护性;-)

虽然最终(或中间)IsNaN检查工作,将检测的情况下,考虑检查/对非法输入做出反应。 (我不知道是否有一种方式来获得[稀有] 在C#中,这比观察到的静态NaN不同信号的NaN,但快速谷歌搜索说:不可能的)

快乐编码。


虽然[标准] 浮点操作不会抛出异常(如NaN被编码为一个浮点值整数数学操作可以抛出异常(如NaN不是编码)。如果操作是使得整数运算是足够的话,就可以用来“抛出”异常:

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

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

-2
  1. 简化这个表达式为多个子表达式,如果可能的话。

  2. 如果可能,换一个“try/catch(DivideByZeroException ex)”块。如果可能的话(例如“24.0”而不是“24”),最重要的是,在“double”(或“float”)空间中做你的aritmetic。

+2

浮点操作不会抛出异常,因此使用try/catch块将无济于事。 –

相关问题