● 計算
算術演算
floatex.dll で行える基本計算は加減乗除、剰余です。
関数は、リファレンスの「算術演算」を参照してください。
floatex_add 、floatex_sub 、floatex_mul 、floatex_div 、floatex_fmod を double 型で表現すると、それぞれ x += y 、x -= y 、x *= y 、x /= y 、x = fmod(x ,y ) となります。
floatex_eadd 、floatex_esub 、floatex_emul 、floatex_ediv 、floatex_efmod は結果を別の領域に格納する関数で、x の内容を変更しません。結果格納先を z として、それぞれ z = x + y 、z = x - y 、z = x * y 、z = x / y 、z = fmod(x ,y ) となります。
演算数が定数の計算も、いくつか用意されています。
これらの関数は、被演算数のみを指定します。
値は FPU のレジスタスタックにロードされ、レジスタ内だけで計算を行います。結果はメモリにストアされます。そのため、x や y 、z に同じアドレスを指定しても問題はありません。
戻り値と関数の接続
算術演算系の関数は、戻り値が出力先のポインタとなっていますので、関数を入れ子で記述する事ができます。
D = A + B / C の場合
a. 別々に記述
floatex_ediv(B , C , D); /* D = B / C */
floatex_add(D , A); /* D += A */
b. ネスト
floatex_add(floatex_ediv(B , C , D) , A);
引数内に入れ子にすると、式が長い場合は少し見難くなりますので、十分な空白を入れる、行を分ける等の工夫をしてください。
例.2元連立方程式
#include "floatex.h"
int equ(
PFLOATEX a,PFLOATEX b,PFLOATEX p, /* ax + by = p */
PFLOATEX c,PFLOATEX d,PFLOATEX q, /* cx + dy = q */
PFLOATEX x,PFLOATEX y)
{
FLOATEX D,t1,t2;
int ret;
/* D = ad - bc */
floatex_esub(
floatex_emul(a,d,t1),
floatex_emul(b,c,t2),
D);
if ((ret = floatex_nzero(D)) != 0){
/* x = (dp - bq) / D */
floatex_ediv(
floatex_sub(
floatex_emul(d,p,t1),
floatex_emul(b,q,t2)),
D,
x);
/* y = (aq - cp) / D */
floatex_ediv(
floatex_sub(
floatex_emul(a,q,t1),
floatex_emul(c,p,t2)),
D,
y);
}
return ret;
}