2011-10-02 65 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塊將無濟於事。 –

相關問題