2017-09-18 15 views
7

我需要測試非有限浮點並消除它們。我刨使用math.IsInf()測試花車,但我已經看到了使用math.IsNaN()爲此,一些脂肪酶。這其中的一個比另一個更好嗎?如果是的話,爲什麼?哪個更適合測試非有限花車IsNaN或IsInf?

編輯:這已被擱置,因爲它是不明所以在這裏,希望能澄清問題的更多信息。我正在從「The Go Programming Language」開始練習3.1,它參考了這個program。這次演習它要求

如果函數f返回非有限float64值,SVG文件>包含無效元素(儘管許多SVG渲染處理>這正常)。修改程序跳過無效的多邊形。

我刨通過將以下的角落FUNC

if math.IsInf(z, 0) { 
    return math.NaN(), math.NaN() 
}  

和改變第二的內容在主循環

ax, ay := corner(i+1, j) 
if math.IsNaN(ax) { 
    continue 
} 
bx, by := corner(i, j) 
if math.IsNaN(bx) { 
    continue 
} 
cx, cy := corner(i, j+1) 
if math.IsNaN(cx) { 
    continue 
} 
dx, dy := corner(i+1, j+1) 
if math.IsNaN(dx) { 
    continue 
} 
fmt.Printf("<polygon points='%g,%g %g,%g %g,%g %g,%g'/>\n", 
      ax, ay, bx, by, cx, cy, dx, dy) 

我想檢查來解決這個問題我的工作,所以我決定查找其他人在網上發佈的其他問題。沒有其他人,我發現曾使用過那裏的解決方案math.IsInf()但大部分人都使用math.IsNaN()。這讓我想知道我是否錯過了某些東西,並且math.IsNaN()由於某種原因更適合此目的。所以我通過Go Docs瀏覽了這兩種功能。我擡頭楠維基百科和IEEE 754.我做了,爲什麼其他人使用math.IsNaN()一般的網頁搜索,即使在我看來不太直觀。然後我在這裏和在stackoverflow搜索答案後,我沒有真正有答案,所以我決定發佈一個問題。

+3

你知道什麼是浮點無窮大和NaN的是誰? – user2357112

+0

@ user2347112 - 據我瞭解,NaN的意思不是一個數字,並表示對0/0這樣的事物的反應,一個負數或無窮大的數字。無限可以是任何數字,以浮點形式表示。至少這是我的研究讓我相信至今爲止。 – sjtwiv

+7

IsInf測試正或負無窮。 IsNaN測試NaN。如果您需要這些測試中的一個或兩個,請使用您需要的一個或多個功能。 – user2357112

回答

-2

從數學上講,它的怪異楠在節目的事情,因爲無效的表達不應該編譯(可惜他們做)。

如果您的號碼不適合實際行(如sqrt(-1)),或者數學上未定義(如0/0),則使用math.IsNaN()

如果您的電話號碼可能非常大(無論是正向還是負向),因此您沒有足夠的位來表示它,或者實際上應該是無窮大,則使用math.IsInf()

+2

表達式可以是有效的,但仍然會產生無意義的結果(例如:被零除)。你如何在不評估整個計劃的情況下提出解決這個問題?這只是變相的暫停問題:https://en.wikipedia.org/wiki/Halting_problem – blz

+0

感謝downvoting,但零除也是一個不應該編譯的無效表達式(或至少產生一個運行時錯誤,例如NaN)...你是否熟悉數學極限?無論如何,更聰明的編程語言即將出現(但不太可能在近期看到主流採用)。你會想要谷歌依賴類型和/或全功能編程。 –

+1

downvote不是從我:)我理解數學限制就好 - 你明白爲什麼編譯時分析不能做你想做的事情?你明白這只是變相的停滯問題嗎?簡單的例子:'1/randint(0,10)'。如果這個編譯?這個例子怎麼樣:'1/int(user_input(「輸入一個數字」))'?你的選擇是(a)拒絕編譯,因爲你可能會得到一個'0'或者(b)如果你在運行時得到一個'0'值就產生一個'NaN'。 – blz