如何在Perl中创建或测试NaN或无限值?
答案 0 :(得分:13)
print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
编辑:修正了负无穷大。
答案 1 :(得分:12)
这是一种相当可靠的方式:
my $inf = 9**9**9;
my $neginf = -9**9**9;
my $nan = -sin(9**9**9);
sub isinf { $_[0]==9**9**9 || $_[0]==-9**9**9 }
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
# useful for detecting negative zero
sub signbit { substr( sprintf( '%g', $_[0] ), 0, 1 ) eq '-' }
for my $num ( $inf, $neginf, $nan ) {
printf("%s:\tisinf: %d,\tisnan: %d,\tsignbit: %d\n", $num, isinf($num), isnan($num), signbit($num));
}
输出是:
inf: isinf: 1, isnan: 0, signbit: 0
-inf: isinf: 1, isnan: 0, signbit: 1
nan: isinf: 0, isnan: 1, signbit: 0
答案 2 :(得分:6)
使用CPAN中的Data::Float。它导出以下功能:
float_is_infinite(
)float_is_nan()
与此处发布的其他半工作解决方案相反,它有一个testsuite。
答案 3 :(得分:5)
就我个人而言,我会使用Math::BigFloat
(或BigInt
)来触及NaN
无穷大的任何事物。
为什么在已有模块执行此工作时,使用黑客解决方案重新发明轮子?
答案 4 :(得分:0)
当我搜索时,我得到了这个网站(这里)和http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/
链接文章指出&#34; nan&#34; ==&#34; nan&#34;当底层c实现支持NaN因为Nan无法匹配时,它永远不会成立。
很好地说明了这一点
die "This perl does not support NaN!\n" if "NaN" == "NaN";
我认为在perl优雅降级并且代码不够低的环境中运行代码的风险可能会让您不必担心太多。
当然,如果您不希望perl插入数字,请使用&#39; eq&#39;不是&#39; ==&#39;
答案 5 :(得分:-3)
简洁的答案可行。
1:如何为输出创建“NAN”变量(例如,对于printf):
{no strict 'subs'; $NAN="NAN"+1;}
2:如何测试“NAN”(看起来像ascii art):
sub isnan {!($_[0]<=0||$_[0]>=0)}
3:如何创建“INF”和INFN变量:
{$INF="INF"+1; $INFN=-"INF"+1}
4:如何测试“INF”(任何符号):
sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}