我需要测试非有限浮点数并消除它们。我正计划使用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上搜索了所有我没有真正答案的答案,所以我决定发一个问题。
答案 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()
,这样您就没有足够的位来代表它,或者它实际上应该是无穷大。