сопроводительный текст http://ecx.images-amazon.com/images/I/61dECNkdnTL._SL500_AA240_.jpg
C++, Как к Программе Это хорошо для новичка. Это - превосходная книга, настолько полная вместе с 1 500 страницами.
Вот довольно надежный способ:
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
].
Зачем изобретать велосипед с помощью хакерского решения, если уже есть модули, которые выполняют эту работу?