GenericMath の各メソッドの概要と備考

# INumberBase

## プロパティ・メソッド一覧

* INumberBase のコメントを翻訳した表です。[マイクロソフトの説明](https://learn.microsoft.com/ja-jp/dotnet/api/system.numerics.inumberbase-1?view=net-8.0)より少し詳しく書いてあります

- ※1 IsCanonicalの意味が正確にわからず筆者の独自の解釈が含まれます

### One

* static abstract TSelf One { get; }
* 型の値1を取得します

### Radix
* static abstract int Radix { get; }
* 型の基数を取得します

#### 例
Byte.Radix=2
Char.Radix=2
Int32.Radix=2
Half.Radix=2
Single.Radix=2
Doubl.Radix=2
Decimal.Radix=10
BigInteger.Radix=2
Complex.Radix=2

### Zero

* static abstract TSelf Zero { get; }
* 型の値0を取得します

### Abs

* static abstract TSelf Abs(TSelf value);
* 値の絶対値を計算する

### CreateChecked

* static virtual TSelf CreateChecked<TOther>(TOther value)
* 値から現在の型のインスタンスを作成し、現在の型の表現可能な範囲外の値に対してはオーバーフロー例外をスローする

### CreateSaturating

* static virtual TSelf CreateSaturating<TOther>(TOther value)
* 値から現在の型のインスタンスを作成し、現在の型の表現可能な範囲外の値を飽和させる。
* 最小値～最大値にクリップされる

### CreateTruncating

* static virtual TSelf CreateTruncating<TOther>(TOther value)
* 値から現在の型のインスタンスを作成し、現在の型の表現可能な範囲外の値は切り捨てます。
* 範囲外のビットを切り捨てる。従来のキャストと同じ

### IsCanonical

* static abstract bool IsCanonical(TSelf value)
* 値が正規表現にあるかどうかを判定します。
* 数値がその型において最も簡潔で一意な形式にあるかどうかを判定するプロパティです。<br>具体的に何が「規範形」であるかは、その型の定義によりますが、基本的には冗長性や多義性のない一意の形式を指します。 <br>指数が正確ではなく末尾に不要な0が含まれているならfalse。正確な整数ならばtrue。<br>

### IsComplexNumber

* static abstract bool IsComplexNumber(TSelf value)
* 値が複素数値を表すかどうかを判定します。
* この関数は、aかbのどちらかがゼロである複素数a + biに対してfalseを返す。つまり、実数と純粋虚数は除外される。

### IsEvenInteger

* static abstract bool IsEvenInteger(TSelf value)
* 値が偶数の整数を表すかどうかを判定します。
* これは浮動小数点値を正しく扱うので、2.0はtrueを返し、2.2はfalseを返す。この関数がfalseを返すことは、"IsOddInteger(TSelf) "がtrueを返すことを意味するわけではありません。端数のある数、3.3は偶数でも奇数でもありません。

### IsFinite

* static abstract bool IsFinite(TSelf value)
* 値が有限かどうかを判定する。
* この関数が falseを返すことは、"IsInfinity(TSelf) "が trueを返すことを意味しない。NaNは有限でも無限でもない。

### IsImaginaryNumber

* static abstract bool IsImaginaryNumber(TSelf value)
* 値が純粋な虚数を表すかどうかを判定します。
* この関数は、aが0でない複素数a + biに対して falseを返す。

### IsInfinity

* static abstract bool IsInfinity(TSelf value)
* 値が無限かどうかを判定する。
* この関数がfalseを返したからといって、"IsFinite(TSelf) "がtrueを返すとは限らない。NaNは有限でも無限でもない。

### IsInteger

* static abstract bool IsInteger(TSelf value)
* 値が整数を表すかどうかを判定します。
* これは浮動小数点値を正しく扱うので、2.0と3.0はtrueを返し、2.2と3.3はfalseを返す。

### IsNaN

* static abstract bool IsNaN(TSelf value)
* 値がNaNかどうかを判定する。

### IsNegative

* static abstract bool IsNegative(TSelf value)
* 値が負の実数を表すかどうかを判定します。
* この型が符号付きゼロを持つ場合、-0も負とみなされる。この関数がfalseを返すことは、"IsPositive(TSelf) "がtrueを返すことを意味しない。複素数、a + bi（bが0でない場合）は、正でも負でもありません。

### IsNegativeInfinity

* static abstract bool IsNegativeInfinity(TSelf value)
* 負の無限大かどうかを判定します

### IsNormal

* static abstract bool IsNormal(TSelf value)
* 正規化された値（normal）かどうかを判定する
* 「正規化された値」というのは、浮動小数点数において、数値が最も効率的に表現されていることを意味します
* 非正規化された数とは、仮数部が 0 に近く、指数部が最小値に達した場合の非常に小さな数値。「サブノーマル数」と呼ばれます。
* IsNormal が true になる場合:
** 数値が 0 ではない。
** 数値が無限大ではない。
** 数値が NaN ではない。
** 仮数部が正規化された範囲に収まっている。
** 整数型においては常に true になります。

### IsOddInteger

* static abstract bool IsOddInteger(TSelf value)
* 奇数の整数かどうかを判定します。
* この関数はfalseを返すが、"IsOddInteger(TSelf) "がtrueを返すわけではない。3.3という小数部分を持つ数は、偶数でも奇数でもありません。

### IsPositive

* static abstract bool IsPositive(TSelf value)
* 値がゼロを表すか正の実数を表すかを判定する。
* この型が符号付きゼロを持つ場合、-0は正とみなされないが、+0は正とみなされる。この関数が偽を返すことは、"IsNegative(TSelf) "が真を返すことを意味しない。複素数 a + bi は b が0でない場合、正でも負でもありません。

### IsPositiveInfinity

* static abstract bool IsPositiveInfinity(TSelf value)
* 正の無限大かどうかを判定します。

### IsRealNumber

* static abstract bool IsRealNumber(TSelf value)
* 値が実数値を表すかどうかを判定する。
* この関数は、複素数a + bi（bはゼロ）に対して真を返す。

### IsSubnormal

* static abstract bool IsSubnormal(TSelf value)
* 値が正常かどうかを判定する。

### IsZero

* static abstract bool IsZero(TSelf value)
* 値がゼロかどうかを判定する。
* この関数は正のゼロも負のゼロもゼロとして扱うので、+0.0と-0.0に対して真を返す。

### MaxMagnitude

* static abstract TSelf MaxMagnitude(TSelf x, TSelf y)
* 2つの値を比較して、どちらが大きいかを計算する。
* IFloatingPointIeee754{TSelf} の場合、このメソッドは IEEE 754:2019 maximumMagnitude 関数と一致します。これは、NaN入力が呼び出し元に伝搬され、-0.0が+0.0未満として扱われることを必要とします。

### MaxMagnitudeNumber

* static abstract TSelf MaxMagnitudeNumber(TSelf x, TSelf y)
* 2つの値を比較してどちらが大きいかを計算し、入力がNaNの場合はもう一方の値を返す。
* IFloatingPointIeee754{TSelf} の場合、このメソッドは IEEE 754:2019 maximumMagnitudeNumber 関数に一致します。これは、NaN入力が呼び出し元に伝搬されず、-0.0が+0.0未満として扱われることを必要とします。

### MinMagnitude

* static abstract TSelf MinMagnitude(TSelf x, TSelf y)
* 2つの値を比較して、どちらが小さいかを計算する。
* IFloatingPointIeee754{TSelf} の場合、このメソッドは IEEE 754:2019 の minimumMagnitude 関数に一致します。これは、NaN入力が呼び出し元に伝搬され、-0.0が+0.0未満として扱われることを必要とします。

### MinMagnitudeNumber

* static abstract TSelf MinMagnitudeNumber(TSelf x, TSelf y)
* 2つの値を比較してどちらが小さいかを計算し、入力がNaNの場合はもう一方の値を返す。
* IFloatingPointIeee754{TSelf} の場合、このメソッドは IEEE 754:2019 minimumMagnitudeNumber 関数に一致します。これは、NaN入力が呼び出し元に伝搬されず、-0.0が+0.0未満として扱われることを必要とします。

### Parse

* static abstract TSelf Parse(string s, NumberStyles style, IFormatProvider? provider)
* 文字列を値にパースする。

* static abstract TSelf Parse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider? provider)
* 文字の範囲を解析して値に変換する。

* static virtual TSelf Parse(ReadOnlySpan<byte> utf8Text, NumberStyles style, IFormatProvider? provider)
* UTF-8文字の範囲を解析して値に変換する。

### TryConvertFromChecked

* protected static abstract bool TryConvertFromChecked<TOther>(TOther value, [MaybeNullWhen(false)] out TSelf result)
* 値を現在の型のインスタンスに変換しようとし、現在の型の表現可能な範囲外の値に対してはオーバーフロー例外をスローする。

### TryConvertFromSaturating

* protected static abstract bool TryConvertFromSaturating<TOther>(TOther value, [MaybeNullWhen(false)] out TSelf result)
* 値を現在の型のインスタンスに変換しようとし、現在の型の表現可能な範囲外の値を飽和させる。

### TryConvertFromTruncating

* protected static abstract bool TryConvertFromTruncating<TOther>(TOther value, [MaybeNullWhen(false)] out TSelf result)
* 値を現在の型のインスタンスに変換しようとし、現在の型の表現可能な範囲外の値は切り捨てられる。

### TryConvertToChecked

* protected static abstract bool TryConvertToChecked<TOther>(TSelf value, [MaybeNullWhen(false)] out TOther result)
* 現在の型のインスタンスを別の型に変換しようとし、現在の型の表現可能な範囲外の値に対してはオーバーフロー例外をスローする。

### TryConvertToSaturating

* protected static abstract bool TryConvertToSaturating<TOther>(TSelf value, [MaybeNullWhen(false)] out TOther result)
* 現在の型のインスタンスを別の型に変換しようとし、現在の型の表現可能な範囲外の値を飽和させる。

### TryConvertToTruncating

* protected static abstract bool TryConvertToTruncating<TOther>(TSelf value, [MaybeNullWhen(false)] out TOther result)
* 現在の型のインスタンスを別の型に変換しようとし、現在の型の表現可能な範囲外の値は切り捨てられる。

### TryParse

* static abstract bool TryParse([NotNullWhen(true)] string? s, NumberStyles style, IFormatProvider? provider, [MaybeNullWhen(false)] out TSelf result)
* 文字列を値にパースしようとする。

* static abstract bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider? provider, [MaybeNullWhen(false)] out TSelf result)
* 文字のスパンを値にパースしようとする

* static virtual bool TryParse(ReadOnlySpan<byte> utf8Text, NumberStyles style, IFormatProvider? provider, [MaybeNullWhen(false)] out TSelf result)
* UTF-8文字のスパンを値にパースしようとする




## double型の場合のIsNormal()とIsSubnormal()の動作

| 数値 | IsNormal()の結果 | IsSubnormal()の結果 | 備考 |
|-|-|-|-|
| 0       | False | False | 常にFalse |
| 1       | True  | False | |
| -1      | True  | False | |
| 0.001   | True  | False | |
| Epsilon | False | True  | |
| NaN     | False | False | 常にFalse |
| ∞      | False | False | 常にFalse |
| -∞     | False | False | 常にFalse |

# IFloatingPointIeee754

### ScaleB(TSelf x, int n);

* 値とその底基数の積を、指定された累乗に引き上げる
* x:基数を 「n 」乗した値
* n:x を乗算する前に基数を上げる値
* returns:x と底基数の積をn乗したもの