Go 对于非有限浮点数IsNaN或IsInf的测试,哪个更好?
我需要测试非有限浮动并消除它们。我计划使用Go 对于非有限浮点数IsNaN或IsInf的测试,哪个更好?,go,nan,Go,Nan,我需要测试非有限浮动并消除它们。我计划使用math.IsInf()来测试浮动,但我看到一些ppl使用math.IsNaN()来实现这一目的。其中一个比另一个更好吗?如果是,为什么 编辑:这已经被搁置,因为它是不清楚的,所以这里有更多的信息,希望能澄清这个问题。我在做“Go编程语言”的练习3.1,它引用了这个。它要求的练习 如果函数f返回一个非有限的float64值,SVG文件将>包含无效元素(尽管许多SVG渲染器会优雅地处理>)。修改程序以跳过无效多边形 我计划通过在角函数中添加以下内容来解决此
math.IsInf()
来测试浮动,但我看到一些ppl使用math.IsNaN()
来实现这一目的。其中一个比另一个更好吗?如果是,为什么
编辑:这已经被搁置,因为它是不清楚的,所以这里有更多的信息,希望能澄清这个问题。我在做“Go编程语言”的练习3.1,它引用了这个。它要求的练习
如果函数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)
ax,ay:=拐角(i+1,j)
如果math.IsNaN(ax){
持续
}
bx,by:=角(i,j)
if math.IsNaN(bx){
持续
}
cx,cy:=拐角(i,j+1)
if math.IsNaN(cx){
持续
}
dx,dy:=角(i+1,j+1)
if math.IsNaN(dx){
持续
}
fmt.Printf(“\n”,
ax、ay、bx、by、cx、cy、dx、dy)
我想检查我的工作,所以我决定查找其他ppl在网上发布的关于这个问题的任何答案。我发现没有其他人在这些解决方案中使用了
math.IsInf()
,但大多数人使用了math.IsNaN()
。这让我怀疑我是否遗漏了一些东西,是否出于某种原因,math.IsNaN()
更适合这个目的。所以我查看了这两个函数的Go文档。我查阅了维基百科和IEEE754。我在网上搜索了一下为什么其他人都在使用math.IsNaN()
,尽管这对我来说似乎不那么直观。然后我在这里和stackoverflow上搜索答案,因为所有这些我都没有真正的答案,所以我决定发布一个问题。如果你只需要考虑其中一个无穷大,那么math.IsInf()
就足够了。但是,如果您需要同时防范无穷大和非数字的值,则应将两者结合使用
有关浮动的更多信息,请参见:
math.IsNaN()
不适用于无限值的一个例子:从数学上讲,NaN是编程中的一件事,这很奇怪,因为无效表达式不应该编译(不幸的是,它们确实编译)
如果您的数字不符合实数行(例如sqrt(-1),或者在数学上没有定义(例如0/0),请使用math.IsNaN()
使用math.IsInf(),或者它实际上应该是无穷大。你知道浮点无穷大和NaN是什么吗?@user2347112-据我所知,NaN的意思不是一个数字,它表示对0/0、负数幂或无穷大的响应。无穷大是由浮点表示的任意长度的数字。至少到目前为止,这是我的研究让我相信的。IsInf测试正无穷大或负无穷大。IsNaN测试NaN。如果您需要其中一个或两个测试,请使用一个或多个执行所需操作的函数。我在为“Go Programming Langauge”一书做相同练习时发现了这个问题。表达式可能有效,但仍然会产生无意义的结果(例如:除以零)。你打算如何在不评估整个计划的情况下解决这个奇怪的问题?这只是伪装的停顿问题:感谢下行投票,但被零除也是一个无效的表达式,不应编译(或至少产生运行时错误,例如NaN)。。。你熟悉数学极限吗?无论如何,更智能的编程语言即将出现(但不太可能很快被主流采用)。你会想用谷歌搜索依赖类型和/或全部函数编程。反对票不是我说的:)我很理解数学极限——你明白为什么编译时分析不能做你希望它做的事情吗?你知道这只是伪装的停顿问题吗?简单示例:1/randint(0,10)
。这个应该编译吗?这个例子怎么样:1/int(用户输入(“输入数字”))
?您的选择是(a)拒绝编译,因为您可能会得到0
,或者(b)如果您在运行时得到0
值,则会产生NaN
。因为您似乎对停止问题感兴趣,您可能会喜欢阅读有关总体函数编程及其数据和codata之间的区别的书籍!无论如何,你会发现许多语言都在慢慢地朝着不让1/int(用户输入(“输入一个数字”))
通过编译器而不需要至少某种形式的显式错误处理的方向发展(也许现在在js中Monad甚至很常见!)。我的全部观点是NaN是处理运行时异常的一种糟糕的方式,这主要是由于遗留下来的问题。