为什么我得到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_val
和val5
是等于其他值的局部变量。h
、m
、s
分别代表小时、分、秒。
我的问题:当m
和s
都等于0时,我得到的是NaN
而不是我的答案。当h
和m
等于0时,也可以实现NaN
。
我应该在我的代码中添加什么会抛出异常?我确信这个"非数字"错误"的原因是我除以零。
NaN很容易产生:
float f = 0.0f / 0; // NaN (note use of fp operand to promote / to fp)
float g = f + 42; // NaN
h
, m
和s
中的零是如何引起的?记住,一旦引入了NaN
,它将在大多数情况下静默传播。(正如其他人建议的那样,将问题分解成更小的部分将有助于调试——并且可能在未来可维护性;-)
虽然最终(或中间)IsNaN
检查可以检测到这种情况,但也要考虑检查/对非法输入做出反应。(我不确定是否有一种方法可以在c#中获得[罕见的]信号NaN,这与观察到的安静的NaN不同,但快速谷歌搜索说:不可能。)
幸福的编码。
虽然[standard] 浮点运算不会抛出异常(因为NaN
被编码为浮点值),但是整数数学运算可能会抛出异常(因为NaN
没有被编码)。如果操作是这样的整数数学是足够的,那么它可以用来"抛出"一个异常:
int zero = 0; // to trick compiler
int k = 42 / zero; // KABOOM! (DivideByZeroException)
浮点运算不会抛出异常。除以零显然不会得到一个有效的答案,所以你应该在计算之前检查一下这种情况。
-
如果可能,将此表达式简化为多个子表达式。
-
如果可能的话,用"try/catch (DivideByZeroException ex)"块换行。
-
最重要的是,如果可能的话,在"double"(或"float")空间中进行计算(例如:"24.0"代替"24")