我们如何在我们的代码中使用它们,以及什么会导致NaN(不是数字)?
在Common Lisp中是否存在表示无穷大或无数字(NAN)的实现独立方式?它需要是双浮点数,并且具有正值和负值.在SBCL,结果
(apropos "INFINITY")
Run Code Online (Sandbox Code Playgroud)
包括
SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY (bound)
SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY (bound)
Run Code Online (Sandbox Code Playgroud)
但我需要它在所有实现中都可用.我有一个编写包的附录,可以在所有平台上运行,它需要表示无限和NAN.即使是其他图书馆的功能也足够了.
我iee-floats装了,现在它是我图书馆的一部分.我有一个功能,可以检测数字是否为NaN,以及检测数字是否为无穷大的函数; 我没有测试NaN,但是我的无限函数需要数字为双浮点数.SBCL的SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY作品,但我需要它独立于实现.
我试图找到range具有无限值的数据框:
> f <- data.frame(x=c(1,2),y=c(3,Inf))
> range(f)
[1] 1 Inf
> range(f,finite=TRUE)
Error in FUN(X[[2L]], ...) :
only defined on a data frame with all numeric variables
Calls: Summary.data.frame -> lapply -> FUN
> range(f$y)
[1] 3 Inf
> range(f$y,finite=TRUE)
[1] 3 3
Run Code Online (Sandbox Code Playgroud)
为什么我收到错误?
我可以做得更好吗?
> do.call(range,lapply(f,range,finite=TRUE))
[1] 1 3
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?它知道了吗?我应该报告吗?
我们什么时候需要使用Infinity值,如果可用的话,请添加一个真实的样本.
在Fortran中将变量设置为+ Infinity最安全的方法是什么?目前我正在使用:
program test
implicit none
print *,infinity()
contains
real function infinity()
implicit none
real :: x
x = huge(1.)
infinity = x + x
end function infinity
end program test
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的方法?
在JSON API中表示无穷大的最佳方法是什么?例如,可以免费阅读本月的文章(对于某些订阅,这将是一个有限的数字,对于高级订阅,这将是无限的).
返回null此用例或扩展 JSON并使用javascript的Infinity值是一个更好的主意吗?后者似乎更合适,但我从未见过这样做的API的例子.
如果有人有任何代表无限的公共Web API的例子,那也很酷.
我有一个可能是零的数字.我除以那个数字,所以我想测试它是否为零以防止NaN和无穷大.由于分区内的舍入错误,我是否仍然可以创建NaNs /无穷大?
double x; // might be zero
double y;
if(x != 0) return y / x;
Run Code Online (Sandbox Code Playgroud)
编辑
谢谢你的回复.我会添加一些子问题.
1)假设x和y都不是NaN/+ INF或-INF,会导致-INF/+ INF导致更多的CPU周期或任何其他不希望的行为的分割?(会崩溃吗?)
2)有没有办法防止分裂导致无穷大?使用偏移等.
以下代码将如何表现,尤其是当双计数器达到其极限时((2-2 ^ -52)·2 ^ 1023)?
for (double i = 0; i < Double.POSITIVE_INFINITY; i++){
//do something
}
Run Code Online (Sandbox Code Playgroud)
此代码是否会按预期运行(永远循环)或在某些时候失败,为什么?
谢谢.
我想知道如何定义inf和-inf作为intPython 2.7.我想,似乎inf并-inf只能作为一个工作float.
a = float('-inf') # works
b = float('inf') # works
c = int('-inf') # compile error, ValueError: invalid literal for int() with base 10: 'inf'
d = int('inf') # compile error, ValueError: invalid literal for int() with base 10: 'inf'
Run Code Online (Sandbox Code Playgroud) 这可能是自行车脱落,但也许有一些有趣的东西让我失踪......
如果一个类初始化一个成员val,std::numeric_limits<double>::infinity()然后想要检查val是否已被更改为有效的东西(+/- inf在这里无效),这3种方法的权衡是什么,我是否错过任何其他有趣的方法来解决这个问题.(为了便于阅读,删除了const.)
bool IsInit() { return MinX != std::numeric_limits<double>::infinity(); } // a
bool IsInit() { return !std::isinf(MinX); } // b
bool IsInit() { return std::isfinite(MinX); } // c
Run Code Online (Sandbox Code Playgroud)
现在代码是C++ 03,但是如何使用C++ 11,C++ 14和C++ 17来改变选项.例如,使用C++ 17,这段代码可能就是这样std::optional<double> val.或者安静NaN是一个更安全的赌注,只是因为+/- inf在未来变得有效?
当我在阅读此代码的补丁时出现了这个问题:
为便于参考:
相关类型: