#!/usr/bin/perl
# Idiom #285 Set variable to NaN
use feature 'say';
# built-in support (use POSIX not needed))
my $a = 'nan';
say $a;
# prints string value: nan
say ( 0 + $a );
# prints numeric value: NaN
say '$a string value is ' . $a;
say '$a numeric value is ' . (0+$a);
say '-' x 20;
# POSIX module provides additional control
use POSIX
qw(:nan_payload nan isnan issignaling getpayload
);
say isnan($a) ? 'true' : 'false';;
# prints true
say $a == $a ? 'true' : 'false';
# prints false because NaN does not equal NaN
say issignaling($a) ? 'true' : 'false';
# prints false because $a is non-signaling
my $b = nan(999); # set to signaling NaN by adding a payload
say $b;
# prints NaN
say getpayload($b);
# prints 999
IyEvdXNyL2Jpbi9wZXJsCgojIElkaW9tICMyODUgU2V0IHZhcmlhYmxlIHRvIE5hTgoKdXNlIGZlYXR1cmUgJ3NheSc7CgojIGJ1aWx0LWluIHN1cHBvcnQgKHVzZSBQT1NJWCBub3QgbmVlZGVkKSkKbXkgJGEgPSAnbmFuJzsKCnNheSAkYTsKIyBwcmludHMgc3RyaW5nIHZhbHVlOiBuYW4KCnNheSAoIDAgKyAkYSApOwojIHByaW50cyBudW1lcmljIHZhbHVlOiBOYU4KCnNheSAnJGEgc3RyaW5nIHZhbHVlIGlzICcgLiAkYTsKc2F5ICckYSBudW1lcmljIHZhbHVlIGlzICcgLiAoMCskYSk7CgpzYXkgJy0nIHggMjA7CgojIFBPU0lYIG1vZHVsZSBwcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRyb2wKdXNlIFBPU0lYIHF3KDpuYW5fcGF5bG9hZCBuYW4gaXNuYW4gaXNzaWduYWxpbmcgZ2V0cGF5bG9hZCk7CgpzYXkgaXNuYW4oJGEpID8gJ3RydWUnIDogJ2ZhbHNlJzs7CiMgcHJpbnRzIHRydWUKCnNheSAkYSA9PSAkYSA/ICd0cnVlJyA6ICdmYWxzZSc7CiMgcHJpbnRzIGZhbHNlIGJlY2F1c2UgTmFOIGRvZXMgbm90IGVxdWFsIE5hTgoKc2F5IGlzc2lnbmFsaW5nKCRhKSA/ICd0cnVlJyA6ICdmYWxzZSc7CiMgcHJpbnRzIGZhbHNlIGJlY2F1c2UgJGEgaXMgbm9uLXNpZ25hbGluZwoKbXkgJGIgPSBuYW4oOTk5KTsgICMgc2V0IHRvIHNpZ25hbGluZyBOYU4gYnkgYWRkaW5nIGEgcGF5bG9hZAoKc2F5ICRiOwojIHByaW50cyBOYU4KCnNheSBnZXRwYXlsb2FkKCRiKTsKIyBwcmludHMgOTk5Cg==