题
我如何创造或测试南或无限值在Perl?
解决方案 2
下面是一个相当可靠的方法:
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
其他提示
print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
修改强>:固定为负无穷大
就个人而言,我会使用Math::BigFloat
(或BigInt
),用于任何将要触摸NaN
的无穷大。
为什么用时已经存在该做的工作模块,一个黑客的解决方案推倒重来?
当我搜索了我得到了这个网站(里)和 http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/
链接的文章指出,"南"=="南"是不正确的,当基础c执行支持南,因为南不能比赛本身。
这是很好的说明
die "This perl does not support NaN!\n" if "NaN" == "NaN";
我猜风险的运行,你代码的环境中perl有退化地及你的代码有没有可能低的足以使你不用担心太多。
当然,如果你不想perl插为一个数字使用'eq'不'=='
这工作简洁答案如下:
1:如何创建用于输出一个 “NAN” 变量(对printf,例如):
{no strict 'subs'; $NAN="NAN"+1;}
2:如何测试 “NAN”(看起来像ASCII艺术):
sub isnan {!($_[0]<=0||$_[0]>=0)}
3:如何创建 “INF” 和INFN变量:
{$INF="INF"+1; $INFN=-"INF"+1}
4:如何测试 “INF”(任何符号的):
sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}
不隶属于 StackOverflow