哪个更适合测试非有限浮点数IsNaN或IsInf?

时间:2017-09-18 16:38:14

标签: go nan

我需要测试非有限浮点数并消除它们。我正计划使用math.IsInf()来测试浮点数,但我已经看到一些使用math.IsNaN()的ppl用于此目的。其中一个比另一个更好吗?如果是这样,为什么?

编辑:这已被搁置,因为目前还不清楚,所以这里有更多的信息可以澄清这个问题。我正在从“The Go Programming Language”做练习3.1,它引用了这个program。它要求的练习

  

如果函数f返回非有限的float64值,则SVG文件将>包含无效元素(尽管许多SVG渲染器处理>这优雅)。修改程序以跳过无效多边形。

我正计划通过将以下内容添加到角落功能

来解决它
if math.IsInf(z, 0) {
    return math.NaN(), math.NaN()
}    

并将main中第二个for循环的内容更改为

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上查找了NaN。我做了一般的网络搜索,为什么其他人都在使用math.IsNaN(),尽管它对我来说似乎不太直观。然后我在这里和stackoverflow上搜索了所有我没有真正答案的答案,所以我决定发一个问题。

2 个答案:

答案 0 :(得分:4)

如果您只需要考虑无穷大,那么math.IsInf()就足够了。但是,如果你需要防止无穷大和不是数字的值,你应该同时使用它们。

有关花车的更多阅读:https://en.wikipedia.org/wiki/IEEE_754

math.IsNaN()无法使用无限值​​的示例:https://play.golang.org/p/blHjr8i7p9

答案 1 :(得分:-2)

从数学角度讲,NaN在编程中是一件很奇怪的事情,因为无效的表达式不应该编译(不幸的是它们会编译)。

如果您的号码不符合实线(例如sqrt(-1))或者数学上未定义(如0/0),请使用math.IsNaN()。< / p>

如果您的号码可能非常大(无论是正方向还是负方向),请使用math.IsInf(),这样您就没有足够的位来代表它,或者它实际上应该是无穷大。