hspmathex.dll
Version 3.8
Date 2026/04/18
Author IronHSP
hspmathex
bi_abs
BigInt 絶対値
h の絶対値 |h| を新しい BigInt ハンドルとして return します。
bi_add
BigInt 加算 (a + b)
a + b を計算し、結果を新しい BigInt ハンドルとして return します。
a, b は変更されません。結果ハンドルは不要になったら bi_free で
解放してください。
bi_and
BigInt ビット AND (a & b)
a と b のビット単位 AND を計算し、結果ハンドルを return します。
負数は 2 の補数表現として扱われます。
bi_bitlen
BigInt のビット長
|h| を 2 進表現したときのビット数を int で return します。
0 の場合は 0 を返します。
負数の場合は絶対値のビット長が返ります。
bi_clone
BigInt ハンドルを複製
BigInt ハンドル h と同じ値を持つ新しいハンドルを生成して返します。
BigInt は値セマンティクスで扱うべきなので、他の変数に「コピー」
したい場合は必ず bi_clone を通してください (同じハンドルを共有
すると片方の bi_free で両方が無効になります)。
bi_cmp
BigInt 比較 (a と b)
a と b を比較し、
a < b : 負の整数
a == b : 0
a > b : 正の整数
を return します (C の strcmp 風)。
具体的な大小だけ知りたい場合は return 値の符号だけ見れば十分です。
bi_create_int
int から BigInt ハンドルを生成
32bit 整数値 v から BigInt のハンドルを生成し、return 値として
返します (関数形式)。不要になったら必ず bi_free で解放してください。
ハンドル 0 は無効値 (生成失敗) を意味します。
bi_create_int64_split
2 つの int32 から 64bit 値を合成して BigInt を生成
HSP の標準型には 64bit 整数が無いため、2 つの int32 (lo, hi) に
分割された 64bit 値から BigInt ハンドルを生成します。
bi_create_str
10進文字列から BigInt ハンドルを生成
10進文字列 s から BigInt のハンドルを生成します。
桁数に制限はありません。パース失敗時はハンドル 0 が返ります。
不要になったら bi_free で解放してください。
bi_div
BigInt 除算 (a / b, 切り捨て)
a / b の商を BigInt として return します (整数除算、余りは切り捨て)。
余りも必要な場合は別途 bi_mod を呼ぶか、事前に bigdec_div で
浮動小数精度の商を取るか検討してください。
b が 0 の場合はハンドル 0 が返ります。
bi_free
BigInt ハンドルを解放
BigInt ハンドル h を解放します。
解放忘れはメモリリークになるので、ハンドル API を使う際には
生成したハンドルは必ず bi_free で解放してください。
ハンドル 0 を渡した場合は何もしません (安全)。
bi_gcd
BigInt 最大公約数
a と b の最大公約数 (GCD) を BigInt として return します。
a, b が 0 の場合でもエラーにはなりません (GCD(0, x) = x)。
bi_mod
BigInt 剰余 (a mod b)
a を b で割った余りを BigInt として return します。
負数に対する挙動は「結果の符号は a と同じ」です (C 言語の %
と同じ truncated modulo)。b が 0 の場合はハンドル 0 が返ります。
bi_mul
BigInt 乗算 (a * b)
a * b を計算し、結果を新しい BigInt ハンドルとして return します。
桁数が膨大になる場合は内部で Karatsuba 系アルゴリズムが使われる
ので、通常の筆算乗算より高速です。
結果ハンドルは不要になったら bi_free してください。
bi_neg
BigInt 符号反転 (-h)
h の符号を反転した値 -h を新しい BigInt ハンドルとして return
します。
bi_or
BigInt ビット OR (a | b)
a と b のビット単位 OR を計算し、結果ハンドルを return します。
bi_pow
BigInt 冪乗 (a ^ exp)
a の exp 乗を BigInt として return します。exp は通常の int です。
exp が非常に大きい場合は結果の桁数が爆発的に増えるので注意
してください (メモリ消費と計算時間)。
bi_shl
BigInt 左シフト (a << n)
a を n ビット左にシフトした値を BigInt として return します。
n が負の場合の挙動は未定義なので、0 以上を渡してください。
bi_shr
BigInt 右シフト (a >> n, 算術)
a を n ビット右にシフトした値を BigInt として return します。
負の値に対しては算術シフト (符号拡張) になります。
bi_sub
BigInt 減算 (a - b)
a - b を計算し、結果を新しい BigInt ハンドルとして return します。
結果が負になる場合もそのまま表現されます。
結果ハンドルは不要になったら bi_free してください。
bi_to_hex
BigInt を16進文字列に変換
BigInt ハンドル h の値を16進文字列に変換し var に格納します。
bi_to_str(h, var, 16) とほぼ同じですが、大文字/小文字の指定が
できる点が異なります。
bi_to_int32
BigInt を 32bit 整数に変換
BigInt ハンドル h の値を 32bit 整数として取り出して return 値で
返します (関数形式)。値が 32bit に収まらない場合は下位 32bit だけ
が返ります (切り詰め)。
bi_to_int64
BigInt を 2 つの int32 (64bit 分割) に変換
BigInt ハンドル h の値を 64bit として取り出し、2 つの int32 に
分割して var に格納します。
bi_to_int64_split
BigInt を 2 つの変数に 64bit 分割して取り出す
BigInt ハンドル h の値を 64bit として取り出し、下位 32bit を lo_var
に、上位 32bit を hi_var に格納します。
bi_to_int64 は配列を使いますが、こちらは別々の変数として受け取れる
便利形です。
bi_to_str
BigInt を指定基数の文字列に変換
BigInt ハンドル h の値を radix 進数の文字列に変換して var に格納
します。var は sdim 等であらかじめ十分なサイズを確保しておく必要
があります (10 進で 1 桁あたり log10(2)*bit 程度)。
bi_xor
BigInt ビット XOR (a ^ b)
a と b のビット単位 XOR を計算し、結果ハンドルを return します。
bigdec
任意精度10進固定小数値を生成 (HSPVAR 型)
bigdec("...") は任意精度10進固定小数 (bigdec 型) の値を生成します。
10進の小数点以下を正確に保持するので、金額計算のように誤差が
許されない演算に適しています (IEEE754 double では 0.1+0.2 != 0.3
となる問題が起きません)。
bigdec_abs
BigDec 絶対値
|h| を新しい BigDec として return します。
bigdec_add
BigDec 加算 (a + b)
a + b を計算し、結果を新しい BigDec ハンドルとして return します。
結果のスケール (小数点以下の桁数) は a, b のうち大きい方になります。
bigdec_clone
BigDec ハンドルを複製
BigDec ハンドル h と同じ値を持つ新しいハンドルを生成して return
します。変数間で「値コピー」したい場合に使います。
結果ハンドルは不要になったら bigdec_free してください。
bigdec_cmp
BigDec 比較 (a と b)
a と b を比較し、
a < b : 負の整数
a == b : 0
a > b : 正の整数
を return します。スケールが違っても「数学的に同じ値」なら 0 を
返します (例: 1.0 と 1.00 は等しい)。
bigdec_create
文字列から BigDec ハンドルを生成
文字列 s から BigDec ハンドルを生成します。
"3.14", "-0.001", "1.5e10" のような表記が受け付けられます。
パース失敗時はハンドル 0 が返ります。
不要になったら bigdec_free で解放してください。
bigdec_create_from_double
double から BigDec ハンドルを生成
double 値 v を指定 scale で丸めて BigDec ハンドルを生成します。
double には 2 進の丸め誤差があるため、10 進で厳密な値が必要な
場合は bigdec_create("...") 経由の文字列生成を推奨します。
bigdec_div
BigDec 除算 (a / b, 精度・丸め指定)
a / b を scale 桁・指定丸めモードで計算した BigDec を return します。
b が 0 の場合はハンドル 0 が返ります。
bigdec_free
BigDec ハンドルを解放
BigDec ハンドル h を解放します。
解放忘れはメモリリークになります。ハンドル 0 を渡した場合は
何もしません (安全)。
bigdec_get_precision
BigDec の有効桁数を取得
BigDec h の有効桁数 (precision, 先頭の 0 を除いた有効数字の桁数)
を int で return します。
bigdec_get_scale
BigDec のスケール (小数点以下桁数) を取得
BigDec h のスケール (小数点以下の桁数) を int で return します。
負のスケールもあり得ます (例: "120" を scale=-1 で持つと "12e1")。
bigdec_mul
BigDec 乗算 (a * b)
a * b を計算し、結果を新しい BigDec ハンドルとして return します。
結果のスケールは (scale(a) + scale(b)) になります。
精度を抑えたい場合は bigdec_scale や bigdec_round で丸めてください。
bigdec_neg
BigDec 符号反転 (-h)
h の符号を反転した BigDec を return します。
bigdec_pow
BigDec 冪乗 (a ^ exp)
a の exp 乗を BigDec として return します。exp は int。
負の指数や小数指数は未対応です (正確な BigDec 演算では有限桁に
収まらないため)。必要なら double 経由の pow を使うか、ユーザー
側で Taylor 展開を組んでください。
bigdec_round
BigDec を指定精度で丸める
BigDec h を指定された有効桁数で丸めた新しい BigDec を return
します。precision は「先頭から何桁で打ち切るか」で、scale
(小数点以下桁数) とは異なる点に注意してください。
bigdec_scale
BigDec のスケール (小数点以下桁数) を変更
BigDec h のスケールを newScale に変更した新しい BigDec を return
します。
bigdec_sqrt
BigDec 平方根
BigDec h の平方根を scale 桁で計算した BigDec を return します。
Newton 法で反復計算されます。h が負の場合はハンドル 0 が返ります。
scale は必要桁数を明示的に指定してください (例: 20-50 など)。
bigdec_sub
BigDec 減算 (a - b)
a - b を計算し、結果を新しい BigDec ハンドルとして return します。
bigdec_to_double
BigDec を double に変換
BigDec ハンドル h の値を double に変換して var に格納します。
変換時に IEEE754 の精度まで丸められるので、元の精度が保持され
ない場合があります。
bigdec_to_plain_str
BigDec を指数表記なしの文字列に変換
BigDec ハンドル h の値を指数表記を使わない純粋な10進文字列
("0.0000001" や "10000000000000" のような形) として var に格納
します。人間が読みやすい形で表示したい場合に便利です。
bigdec_to_str
BigDec を文字列に変換 (toString)
BigDec ハンドル h の値を文字列に変換して var に格納します。
非常に大きい/小さい値は指数表記 (1.5E+20 など) になることがあり
ます。指数表記を避けたい場合は bigdec_to_plain_str を使ってくだ
さい。
bigint
任意精度整数値を生成 (HSPVAR 型)
bigint("...") は任意精度整数 (bigint 型) の値を生成します。
生成された値は通常の変数に代入でき、+ - * / \ & | ^ == != < > 等の
演算子が HSP の組み込み型と同じ書式で使えます。
simd_abs_d
double 配列の絶対値
要素ごとに |a(i)| を out(i) に格納します。AVX があれば符号ビット
マスクで一気に処理します。
simd_add_d
double 配列加算 (out = a + b)
要素ごとに a(i) + b(i) を計算して out(i) に格納します。
AVX があれば 4 要素ずつ、無ければ SSE2 で 2 要素ずつ処理します。
stat は成功時 0、引数不正 (NULL / n<=0) の時 -1。
simd_add_f
float 配列加算 (out = a + b)
要素ごとに a(i) + b(i) を out(i) に格納します。
AVX があれば 8 要素ずつ、SSE で 4 要素ずつ処理します。
HSP では float 配列を直接扱えないため、通常はバイナリバッファ上の
単精度データに対して使います。
simd_add_i
int32 配列加算 (out = a + b)
要素ごとに a(i) + b(i) を out(i) に格納します。
AVX2 があれば 8 要素ずつ、無ければ SSE2 で 4 要素ずつ処理します。
オーバーフロー時は 32bit ラップアラウンドします。
simd_and_i
int32 配列のビット AND
要素ごとに a(i) & b(i) を out(i) に格納します。
simd_cpu_name
CPU ブランド名取得
CPUID の拡張機能 0x80000002-0x80000004 から得られる CPU の
ブランド名文字列 (例: "Intel(R) Core(TM) i7-...") を var に格納
します。stat は成功時 0、失敗時 -1。
simd_div_d
double 配列除算 (out = a / b)
要素ごとに a(i) / b(i) を out(i) に格納します。
b(i) が 0 の位置は IEEE754 の無限大/NaN になります。
simd_dot_d
double 配列の内積
a・b = Σ a(i)*b(i) を計算して result に格納します。
AVX があれば 4 要素並列で累算します。
simd_dot_f
float 配列の内積
a・b = Σ a(i)*b(i) を計算して result に格納します。
simd_has_avx
AVX 対応判定
CPU+OS が AVX 命令をサポートしているかを判定し 1/0 を return します。
CPUID だけでなく XGETBV による OS サポート確認も行われます。
simd_has_avx2
AVX2 対応判定
CPU+OS が AVX2 命令をサポートしているかを判定し 1/0 を return します。
SIMD 整数演算の多くは AVX2 で高速化されます。
simd_has_avx512
AVX-512 対応判定
CPU+OS が AVX-512 Foundation (AVX-512F) をサポートしているかを
判定し 1/0 を return します。XGETBV による ZMM レジスタの OS 有効
化確認も行われます。
simd_has_sse
SSE 対応判定
実行中の CPU が SSE 命令をサポートしているかを判定し、
1 (対応) / 0 (非対応) を return します。
DLL ロード時に CPUID で一度だけ検出され、以後は定数的に返ります。
simd_has_sse2
SSE2 対応判定
CPU が SSE2 命令をサポートしているかを判定し 1/0 を return します。
simd_matmul_d
double 行列積 C = A * B
row-major の行列積 C = A * B を double 精度で計算します。
AVX があれば 4 列ずつ並列化されます。
simd_matmul_f
float 行列積 C = A * B
row-major の行列積 C = A * B を計算します。
出力行列 C のサイズは m*k 要素分 (float) 確保しておいてください。
AVX があれば 8 列ずつ並列化されます。
simd_max_d
double 配列の最大値
a(i) のうち最大値を result に格納します。
simd_max_i
int32 配列の最大値
a(i) のうち最大値を result に格納します。
simd_min_d
double 配列の最小値
a(i) のうち最小値を result に格納します。
simd_min_i
int32 配列の最小値
a(i) のうち最小値を result に格納します。
simd_mul_d
double 配列乗算 (out = a * b)
要素ごとに a(i) * b(i) を out(i) に格納します。
simd_mul_i
int32 配列乗算 (out = a * b)
要素ごとに a(i) * b(i) を out(i) に格納します。
下位 32bit のみが出力されます (オーバーフロー切り捨て)。
simd_or_i
int32 配列のビット OR
要素ごとに a(i) | b(i) を out(i) に格納します。
simd_pixel_blend
ピクセル配列の α ブレンド
out(i) = a(i) * (1 - alpha) + b(i) * alpha を各バイトで計算し、
0-255 でクランプして出力します。
AVX2 があれば 8 バイトずつ並列化されます。
RGBA 画像であれば n = width * height * 4 を渡します。
simd_pixel_grayscale
RGBA -> グレースケール変換
BT.601 の輝度重み (0.299R + 0.587G + 0.114B) で RGBA を単一
チャンネル 8bit グレースケールに変換します。
内部では 8bit 固定小数点演算です (77*R + 150*G + 29*B + 128) >> 8。
simd_scale_d
double 配列スカラー倍 (out = a * s)
a の各要素を同じスカラー s で掛けて out に格納します。
a = a*s の形で使うと配列一括スケーリングに便利です。
simd_sqrt_d
double 配列の平方根
要素ごとに sqrt(a(i)) を out(i) に格納します。
a(i) が負の位置は NaN になります。
simd_sub_d
double 配列減算 (out = a - b)
要素ごとに a(i) - b(i) を out(i) に格納します。
simd_sub_i
int32 配列減算 (out = a - b)
要素ごとに a(i) - b(i) を out(i) に格納します。
simd_sum_d
double 配列の総和
Σ a(i) を計算して result に格納します。
simd_sum_f
float 配列の総和
Σ a(i) を計算して result に格納します。
simd_sum_i
int32 配列の総和
Σ a(i) を計算して result に格納します。内部では int64 で累算し、
最終結果を int32 範囲にクランプ (飽和) します。
simd_xor_i
int32 配列のビット XOR
要素ごとに a(i) ^ b(i) を out(i) に格納します。