1NAME 2 3 Math::Int128 - Manipulate 128 bits integers in Perl 4 5SYNOPSIS 6 7 use Math::Int128 qw(int128); 8 9 my $i = int128(1); 10 my $j = $i << 100; 11 my $k = int128("1234567890123456789000000"); 12 print($i + $j * 1000000); 13 14DESCRIPTION 15 16 This module adds support for 128 bit integers, signed and unsigned, to 17 Perl. 18 19 In order to compile this module, your compiler must support one of 20 either the __int128 or int __attribute__ ((__mode__ (TI))) types. Both 21 GCC and Clang have supported one or the other type for some time, but 22 they may only do so on 64-bit platforms. 23 24 OSX Caveat 25 26 On OSX, the system Perl is compiled with both the "-arch x86_64" and 27 "-arch i386" flags. When building this module with a Perl like this, we 28 strip the "-arch i386" flag out, meaning it is only compiled for the 29 64-bit architecture. Attempting to use this module while running in 30 32-bit mode may lead to brokenness. It's also possible that this will 31 cause other problems that we cannot foresee. 32 33 Note that if you have built your own non-multiarch Perl on OSX then 34 this will not be an issue. 35 36API 37 38 See Math::Int64. This module provides a similar set of functions, just 39 s/64/128/g ;-) 40 41 Besides that, as object allocation and destruction has been found to be 42 a bottleneck, an alternative set of operations that use their first 43 argument as the output (instead of the return value) is also provided. 44 45 They are as follows: 46 47 int128_inc int128_dec int128_add int128_sub int128_mul int128_pow 48 int128_div int128_mod int128_divmod int128_and int128_or int128_xor 49 int128_left int128_right int128_not int128_neg 50 51 and the corresponding uint128 versions. 52 53 For instance: 54 55 my $a = int128("1299472960684039584764953"); 56 my $b = int128("-2849503498690387383748"); 57 my $ret = int128(); 58 int128_mul($ret, $a, $b); 59 int128_inc($ret, $ret); # $ret = $ret + 1 60 int128_add($ret, $ret, "12826738463"); 61 say $ret; 62 63 int128_divmod returns both the result of the division and the 64 remainder: 65 66 my $ret = int128(); 67 my $rem = int128(); 68 int128_divmod($ret, $rem, $a, $b); 69 70C API 71 72 The module provides a C API that allows to wrap/unwrap int128_t and 73 uint128_t values from other modules written in C/XS. 74 75 It is identical to that provided by Math::Int64 so read the 76 documentation there in order to know how to use it. 77 78TODO 79 80 Support more operations as log2, pow, etc. 81 82BUGS AND SUPPORT 83 84 The C API feature is experimental. 85 86 This module requires 128bit integer support from the C compiler. 87 Currently only gcc 4.4 and later are supported. If you have a different 88 compiler that also supports 128bit integers get in touch with me in 89 order to have it supported. 90 91 You can send me bug reports by email to the address that appears below 92 or use the CPAN RT bug tracking system available at http://rt.cpan.org. 93 94 The source for the development version of the module is hosted at 95 GitHub: https://github.com/salva/p5-Math-Int128. 96 97 My wishlist 98 99 If you like this module and you're feeling generous, take a look at my 100 Amazon Wish List: http://amzn.com/w/1WU1P6IR5QZ42 101 102SEE ALSO 103 104 Math::Int64, Math::GMP, Math::GMPn. 105 106 http://perlmonks.org/?node_id=886488. 107 108COPYRIGHT AND LICENSE 109 110 Copyright © 2007, 2009, 2011-2015 by Salvador Fandiño 111 (sfandino@yahoo.com) 112 113 Copyright © 2014-2015 by Dave Rolsky 114 115 This library is free software; you can redistribute it and/or modify it 116 under the same terms as Perl itself, either Perl version 5.10.1 or, at 117 your option, any later version of Perl 5 you may have available. 118 119