1*256a93a4Safresh1# -*- mode: perl; -*- 2*256a93a4Safresh1 3*256a93a4Safresh1# Binary, octal, and hexadecimal floating point literals were introduced in 4*256a93a4Safresh1# v5.22.0. 5*256a93a4Safresh1# 6*256a93a4Safresh1# - It wasn't until v5.28.0 that binary, octal, and hexadecimal floating point 7*256a93a4Safresh1# literals were converted to the correct value on perls compiled with quadmath 8*256a93a4Safresh1# support. 9*256a93a4Safresh1# 10*256a93a4Safresh1# - It wasn't until v5.34.0 that binary and octal floating point literals worked 11*256a93a4Safresh1# correctly with constant overloading. Before v5.34.0, it seems like the 12*256a93a4Safresh1# second character is always silently converted to an "x", so, e.g., "0b1.1p8" 13*256a93a4Safresh1# is passed to the overload::constant subroutine as "0x1.1p8", and "01.1p+8" 14*256a93a4Safresh1# is passed as "0x.1p+8". 15*256a93a4Safresh1# 16*256a93a4Safresh1# - Octal floating point literals using the "0o" prefix were introduced in 17*256a93a4Safresh1# v5.34.0. 18*256a93a4Safresh1 19*256a93a4Safresh1# Note that all numeric literals that should not be overloaded must be quoted. 20*256a93a4Safresh1 21*256a93a4Safresh1use strict; 22*256a93a4Safresh1use warnings; 23*256a93a4Safresh1 24*256a93a4Safresh1use Test::More tests => "118"; 25*256a93a4Safresh1 26*256a93a4Safresh1use bigint; 27*256a93a4Safresh1 28*256a93a4Safresh1my $class = "Math::BigInt"; 29*256a93a4Safresh1my $x; 30*256a93a4Safresh1 31*256a93a4Safresh1################################################################################ 32*256a93a4Safresh1# The following tests should be identical for Math::BigInt, Math::BigFloat and 33*256a93a4Safresh1# Math::BigRat. 34*256a93a4Safresh1 35*256a93a4Safresh1# These are handled by "binary". 36*256a93a4Safresh1 37*256a93a4Safresh1$x= 0xff; 38*256a93a4Safresh1is($x, "255", "hexadecimal integer literal 0xff"); 39*256a93a4Safresh1is(ref($x), $class, "value is a $class"); 40*256a93a4Safresh1 41*256a93a4Safresh1SKIP: { 42*256a93a4Safresh1 # Hexadecimal literals using the "0X" prefix require v5.14.0. 43*256a93a4Safresh1 skip "perl v5.14.0 required for hexadecimal integer literals" 44*256a93a4Safresh1 . " with '0X' prefix", "2" if $] < "5.014"; 45*256a93a4Safresh1 46*256a93a4Safresh1 $x = eval "0XFF"; 47*256a93a4Safresh1 is($x, "255", "hexadecimal integer literal 0XFF"); 48*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 49*256a93a4Safresh1} 50*256a93a4Safresh1 51*256a93a4Safresh1$x = 0377; 52*256a93a4Safresh1is($x, "255", "octal integer literal 0377"); 53*256a93a4Safresh1is(ref($x), $class, "value is a $class"); 54*256a93a4Safresh1 55*256a93a4Safresh1SKIP: { 56*256a93a4Safresh1 # Octal literals using the "0o" prefix were introduced in v5.34.0. 57*256a93a4Safresh1 skip "perl v5.34.0 required for octal floating point literals" 58*256a93a4Safresh1 . " with '0o' prefix", "4" if $] < "5.034"; 59*256a93a4Safresh1 60*256a93a4Safresh1 for my $str (qw/ 0o377 0O377 /) { 61*256a93a4Safresh1 $x = eval $str; 62*256a93a4Safresh1 is($x, "255", "octal integer literal $str"); 63*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 64*256a93a4Safresh1 } 65*256a93a4Safresh1} 66*256a93a4Safresh1 67*256a93a4Safresh1$x = 0b11111111; 68*256a93a4Safresh1is($x, "255", "binary integer literal 0b11111111"); 69*256a93a4Safresh1is(ref($x), $class, "value is a $class"); 70*256a93a4Safresh1 71*256a93a4Safresh1SKIP: { 72*256a93a4Safresh1 # Binary literals using the "0B" prefix require v5.14.0. 73*256a93a4Safresh1 skip "perl v5.14.0 required for binary integer literals" 74*256a93a4Safresh1 . " with '0B' prefix", "2" if $] < "5.014"; 75*256a93a4Safresh1 76*256a93a4Safresh1 $x = eval "0B11111111"; 77*256a93a4Safresh1 is($x, "255", "binary integer literal 0B11111111"); 78*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 79*256a93a4Safresh1} 80*256a93a4Safresh1 81*256a93a4Safresh1# These are handled by "float". 82*256a93a4Safresh1 83*256a93a4Safresh1$x = 999999999999999999999999999999999999999999999999999999999999999999999999; 84*256a93a4Safresh1is($x, 85*256a93a4Safresh1 "999999999999999999999999999999999999999999999999999999999999999999999999", 86*256a93a4Safresh1 "decimal integer literal " . ("9" x 72)); 87*256a93a4Safresh1is(ref($x), $class, "value is a $class"); 88*256a93a4Safresh1 89*256a93a4Safresh1$x = 1e72 - 1; 90*256a93a4Safresh1is($x, 91*256a93a4Safresh1 "999999999999999999999999999999999999999999999999999999999999999999999999", 92*256a93a4Safresh1 "literal 1e72 - 1"); 93*256a93a4Safresh1is(ref($x), $class, "value is a $class"); 94*256a93a4Safresh1 95*256a93a4Safresh1# These are handled by "float". 96*256a93a4Safresh1 97*256a93a4Safresh1SKIP: { 98*256a93a4Safresh1 # Hexadecimal floating point literals require v5.28.0. 99*256a93a4Safresh1 skip "perl v5.28.0 required for hexadecimal floating point literals", 100*256a93a4Safresh1 "6" * "2" + "2" * "2" if $] < "5.028"; 101*256a93a4Safresh1 102*256a93a4Safresh1 for my $str (qw/ 0x1.3ap+8 0X1.3AP+8 103*256a93a4Safresh1 0x1.3ap8 0X1.3AP8 104*256a93a4Safresh1 0x13a0p-4 0X13A0P-4 /) 105*256a93a4Safresh1 { 106*256a93a4Safresh1 $x = eval $str; 107*256a93a4Safresh1 is($x, "314", "hexadecimal floating point literal $str"); 108*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 109*256a93a4Safresh1 } 110*256a93a4Safresh1 111*256a93a4Safresh1 for my $str (qw/ 0x0.0p+8 0X0.0P+8 /) 112*256a93a4Safresh1 { 113*256a93a4Safresh1 $x = eval $str; 114*256a93a4Safresh1 is($x, "0", "hexadecimal floating point literal $str"); 115*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 116*256a93a4Safresh1 } 117*256a93a4Safresh1} 118*256a93a4Safresh1 119*256a93a4Safresh1SKIP: { 120*256a93a4Safresh1 # Octal floating point literals using the "0o" prefix require v5.34.0. 121*256a93a4Safresh1 skip "perl v5.34.0 required for octal floating point literals" 122*256a93a4Safresh1 . " with '0o' prefix", "6" * "2" + "6" * "2" if $] < "5.034"; 123*256a93a4Safresh1 124*256a93a4Safresh1 for my $str (qw/ 0o1.164p+8 0O1.164P+8 125*256a93a4Safresh1 0o1.164p8 0O1.164P8 126*256a93a4Safresh1 0o11640p-4 0O11640P-4 /) 127*256a93a4Safresh1 { 128*256a93a4Safresh1 $x = eval $str; 129*256a93a4Safresh1 is($x, "314", "octal floating point literal $str"); 130*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 131*256a93a4Safresh1 } 132*256a93a4Safresh1 133*256a93a4Safresh1 for my $str (qw/ 0o0.0p+8 0O0.0P+8 134*256a93a4Safresh1 0o0.0p8 0O0.0P8 135*256a93a4Safresh1 0o0.0p-8 0O0.0P-8 /) 136*256a93a4Safresh1 { 137*256a93a4Safresh1 $x = eval $str; 138*256a93a4Safresh1 is($x, "0", "octal floating point literal $str"); 139*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 140*256a93a4Safresh1 } 141*256a93a4Safresh1} 142*256a93a4Safresh1 143*256a93a4Safresh1SKIP: { 144*256a93a4Safresh1 # Octal floating point literals using the "0" prefix require v5.32.0. 145*256a93a4Safresh1 skip "perl v5.32.0 required for octal floating point literals", 146*256a93a4Safresh1 "6" * "2" + "6" * "2" if $] < "5.032"; 147*256a93a4Safresh1 148*256a93a4Safresh1 for my $str (qw/ 01.164p+8 01.164P+8 149*256a93a4Safresh1 01.164p8 01.164P8 150*256a93a4Safresh1 011640p-4 011640P-4 /) 151*256a93a4Safresh1 { 152*256a93a4Safresh1 $x = eval $str; 153*256a93a4Safresh1 is($x, "314", "octal floating point literal $str"); 154*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 155*256a93a4Safresh1 } 156*256a93a4Safresh1 157*256a93a4Safresh1 for my $str (qw/ 00.0p+8 00.0P+8 158*256a93a4Safresh1 00.0p8 00.0P8 159*256a93a4Safresh1 00.0p-8 00.0P-8 /) 160*256a93a4Safresh1 { 161*256a93a4Safresh1 $x = eval $str; 162*256a93a4Safresh1 is($x, "0", "octal floating point literal $str"); 163*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 164*256a93a4Safresh1 } 165*256a93a4Safresh1} 166*256a93a4Safresh1 167*256a93a4Safresh1SKIP: { 168*256a93a4Safresh1 # Binary floating point literals require v5.32.0. 169*256a93a4Safresh1 skip "perl v5.32.0 required for binary floating point literals", 170*256a93a4Safresh1 "6" * "2" + "6" * "2" if $] < "5.032"; 171*256a93a4Safresh1 172*256a93a4Safresh1 for my $str (qw/ 0b1.0011101p+8 0B1.0011101P+8 173*256a93a4Safresh1 0b1.0011101p8 0B1.0011101P8 174*256a93a4Safresh1 0b10011101000p-2 0B10011101000P-2 /) 175*256a93a4Safresh1 { 176*256a93a4Safresh1 $x = eval $str; 177*256a93a4Safresh1 is($x, "314", "binary floating point literal $str"); 178*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 179*256a93a4Safresh1 } 180*256a93a4Safresh1 181*256a93a4Safresh1 for my $str (qw/ 0b0p+8 0B0P+8 182*256a93a4Safresh1 0b0p8 0B0P8 183*256a93a4Safresh1 0b0p-8 0B0P-8 184*256a93a4Safresh1 /) 185*256a93a4Safresh1 { 186*256a93a4Safresh1 $x = eval $str; 187*256a93a4Safresh1 is($x, "0", "binary floating point literal $str"); 188*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 189*256a93a4Safresh1 } 190*256a93a4Safresh1} 191*256a93a4Safresh1 192*256a93a4Safresh1# These are handled by "integer". 193*256a93a4Safresh1 194*256a93a4Safresh1$x = 314; 195*256a93a4Safresh1is($x, "314", "integer literal 314"); 196*256a93a4Safresh1like(ref($x), qr/^Math::BigInt(::Lite)?$/, 197*256a93a4Safresh1 "value is a Math::BigInt or Math::BigInt::Lite"); 198*256a93a4Safresh1 199*256a93a4Safresh1$x = 0; 200*256a93a4Safresh1is($x, "0", "integer literal 0"); 201*256a93a4Safresh1like(ref($x), qr/^Math::BigInt(::Lite)?$/, 202*256a93a4Safresh1 "value is a Math::BigInt or Math::BigInt::Lite"); 203*256a93a4Safresh1 204*256a93a4Safresh1$x = 2 ** 255; 205*256a93a4Safresh1is($x, 206*256a93a4Safresh1 "578960446186580977117854925043439539266" 207*256a93a4Safresh1 . "34992332820282019728792003956564819968", 208*256a93a4Safresh1 "2 ** 255"); 209*256a93a4Safresh1is(ref($x), $class, "value is a $class"); 210*256a93a4Safresh1 211*256a93a4Safresh1# These are handled by "binary". 212*256a93a4Safresh1 213*256a93a4Safresh1{ 214*256a93a4Safresh1 no warnings "portable"; # protect against "non-portable" warnings 215*256a93a4Safresh1 216*256a93a4Safresh1 # hexadecimal constant 217*256a93a4Safresh1 $x = 0x123456789012345678901234567890; 218*256a93a4Safresh1 is($x, 219*256a93a4Safresh1 "94522879687365475552814062743484560", 220*256a93a4Safresh1 "hexadecimal constant 0x123456789012345678901234567890"); 221*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 222*256a93a4Safresh1 223*256a93a4Safresh1 # octal constant 224*256a93a4Safresh1 $x = 012345676543210123456765432101234567654321; 225*256a93a4Safresh1 is($x, 226*256a93a4Safresh1 "1736132869400711976876385488263403729", 227*256a93a4Safresh1 "octal constant 012345676543210123456765432101234567654321"); 228*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 229*256a93a4Safresh1 230*256a93a4Safresh1 # binary constant 231*256a93a4Safresh1 $x = 0b01010100011001010110110001110011010010010110000101101101; 232*256a93a4Safresh1 is($x, 233*256a93a4Safresh1 "23755414508757357", 234*256a93a4Safresh1 "binary constant 0b0101010001100101011011000111" 235*256a93a4Safresh1 . "0011010010010110000101101101"); 236*256a93a4Safresh1 is(ref($x), $class, "value is a $class"); 237*256a93a4Safresh1} 238