MissingValues is a C# numeric library for C# that introduces support for large integers and higher precision floating-point numbers. It supports generic math.
The library implements 256-bit and 512-bit integers, for both signed (Int256
/Int512
) and unsigned (UInt256
/UInt512
) integer arithmetic operations.
Here is a chart comparing the existing binary integers to the MissingValues integers:
Name | Size | Max Value | Min Value |
---|---|---|---|
sbyte |
8 bits | 127 | -128 |
byte |
8 bits | 255 | 0 |
short |
16 bits | 32,767 | -32,768 |
ushort |
16 bits | 65,535 | 0 |
int |
32 bits | 2,147,483,647 | -2,147,483,648 |
uint |
32 bits | 4,294,967,295 | 0 |
long |
64 bits | 9,223,372,036,854,775,807 | -9,223,372,036,854,775,808 |
ulong |
64 bits | 18,446,744,073,709,551,615 | 0 |
Int128 |
128 bits | 170,141,183,460,469,231,731,687,303,715,884,105,727 | −170,141,183,460,469,231,731,687,303,715,884,105,728 |
UInt128 |
128 bits | 340,282,366,920,938,463,463,374,607,431,768,211,455 | 0 |
Int256 |
256 bits | 57,896,044,618,658,097,711,785,492,504,343,953,926,634,992,332,820,282,019,728,792,003,956,564,819,967 | -57,896,044,618,658,097,711,785,492,504,343,953,926,634,992,332,820,282,019,728,792,003,956,564,819,968 |
UInt256 |
256 bits | 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935 | 0 |
Int512 |
512 bits | 6,703,903,964,971,298,549,787,012,499,102,923,063,739,682,910,296,196,688,861,780,721,860,882,015,036,773,488,400,937,149,083,451,713,845,015,929,093,243,025,426,876,941,405,973,284,973,216,824,503,042,047 | -6,703,903,964,971,298,549,787,012,499,102,923,063,739,682,910,296,196,688,861,780,721,860,882,015,036,773,488,400,937,149,083,451,713,845,015,929,093,243,025,426,876,941,405,973,284,973,216,824,503,042,048 |
UInt512 |
512 bits | 13,407,807,929,942,597,099,574,024,998,205,846,127,479,365,820,592,393,377,723,561,443,721,764,030,073,546,976,801,874,298,166,903,427,690,031,858,186,486,050,853,753,882,811,946,569,946,433,649,006,084,095 | 0 |
Example Usage
using MissingValues; // namespace
// You can use the constructor:
Int256 num1 = new Int256(0x8000_0000_0000_0000, 0x0000_0000_0000_0000, 0x0000_0000_0000_0000, 0x0000_0000_0000_0001);
// You can use Parse():
Int256 num2 = Int256.Parse("10000000000000000000000000000000000000000000000000000000000000000000000000000");
// Or you can convert any other number type:
Int256 num3 = long.MaxValue;
// sum = -57896044618658097711785492504343953926634992332820282019728792003956564819967 + 10000000000000000000000000000000000000000000000000000000000000000000000000000 + 9223372036854775807
Int256 sum = num1 + num2 + num3;
Console.WriteLine($"Sum: {sum}");
// Prints: -47896044618658097711785492504343953926634992332820282019719568631919710044160
The library introduces the Quad
and Octo
struct, representing a quadruple-precision floating-point and a octuple-precision floating-point number respectively.
Quadruple-precision offers higher precision than standard double
or float
types, making it suitable for applications requiring extensive precision in numerical calculations.
Here is a chart comparing the existing IEEE floating point numbers to Quad
and Octo
:
Name | Size | Significand Digits | Decimal Digits | Max Exponent | Min Exponent | Max Value | Min Value |
---|---|---|---|---|---|---|---|
Half | 16 bits | 11 | 3.31 | 15 | -14 | ~65504 | ~-65500 |
Single | 32 bits | 24 | 7.22 | 127 | -126 | ~3.40e38 | ~-3.40e38 |
Double | 64 bits | 53 | 15.95 | 1023 | -1022 | ~1.80e308 | ~-1.79e308 |
Quad | 128 bits | 113 | 34.02 | 16383 | -16382 | ~1.19e4932 | ~-1.18e4932 |
Octo | 256 bits | 237 | 71.34 | 262143 | −262142 | ~1.61e78913 | ~-1.61e78913 |
Example Usage
using MissingValues; // namespace
// You can use the constructor:
Quad num1 = new Quad(sign: false, exp: 0x4004, sig: new UInt128(0x0000_9400_0000_0000, 0x0000_0000_0000_0000));
// You can use Parse():
Quad num2 = Quad.Parse("2e24");
// Or you can convert any other number type:
Quad num3 = 12.25d;
// sum = 50,5 + 2000000000000000000000000 + 12,25
Quad sum = num1 + num2 + num3;
Console.WriteLine($"Sum: {sum}");
// Prints 2000000000000000000000062,75