2017-09-18 21 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