● 計算

算術演算

floatex.dll で行える基本計算は加減乗除、剰余です。
関数は、リファレンスの「算術演算」を参照してください。

floatex_add 、floatex_eadd加算
floatex_sub 、floatex_esub減算
floatex_mul 、floatex_emul乗算
floatex_div 、floatex_ediv除算
floatex_fmod 、floatex_efmod剰余

floatex_add 、floatex_sub 、floatex_mul 、floatex_div 、floatex_fmod を double 型で表現すると、それぞれ x += yx -= yx *= yx /= yx = fmod(x ,y ) となります。


floatex_eadd 、floatex_esub 、floatex_emul 、floatex_ediv 、floatex_efmod は結果を別の領域に格納する関数で、x の内容を変更しません。結果格納先を z として、それぞれ z = x + yz = x - yz = x * yz = x / yz = fmod(x ,y ) となります。


演算数が定数の計算も、いくつか用意されています。

floatex_inc 、floatex_eincインクリメント(x + 1)
floatex_dec 、floatex_edecデクリメント(x - 1)
floatex_mul2 、floatex_emul22倍(x * 2)
floatex_mul10 、floatex_emul1010倍(x * 10)
floatex_mulx 、floatex_emulx2乗(x2
floatex_div2 、floatex_ediv21/2(x / 2)
floatex_div10 、floatex_ediv101/10(x / 10)
floatex_fmod10 、floatex_efmod101/10の剰余(fmod(x , 10))
floatex_reciprocal 、floatex_ereciprocal逆数(1 / x

これらの関数は、被演算数のみを指定します。


値は FPU のレジスタスタックにロードされ、レジスタ内だけで計算を行います。結果はメモリにストアされます。そのため、xyz に同じアドレスを指定しても問題はありません。




戻り値と関数の接続

算術演算系の関数は、戻り値が出力先のポインタとなっていますので、関数を入れ子で記述する事ができます。
  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;
}