Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 对于非有限浮点数IsNaN或IsInf的测试,哪个更好?_Go_Nan - Fatal编程技术网

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是处理运行时异常的一种糟糕的方式,这主要是由于遗留下来的问题。