浮動小数点数

Xtal浮動小数点数の演算速度が、整数と変わらない実装になっています。

Rubyでは整数に比べ、浮動小数点数の演算が遥かに遅くなっています。浮動小数点数は整数と違い、演算する度にFloatオブジェクトがアロケートされているからです。


ゲームでは浮動小数点数演算が多いということを考慮して、Xtalでは浮動小数点数も整数同様特別扱いするよう実装しました。

RubyVALUE相当を、Xtalでは次のようなイメージで保持しています。

  enum Type{
    TYPE_NULL,
    TYPE_OBJECT,
    TYPE_INT,
    TYPE_FLOAT
  };
  struct Value{
    Type type;
    union{
      int ivalue;
      float fvalue;
      void* object;
    };
  };

型情報の保持に2bitしか使用していないため、若干ムダがある構造になってます。
当初は整数の2bit、浮動小数点数仮数部2bitを潰す実装にして埋め込んでいました。
特に支障なく動いていたのですが、整数のbit長が30bitだと色々と不都合が出るように思えたこと、ポータビリティが大きく損なわれることを考慮し、現在のような実装になってます。

将来的に二通りの実装を切り替えられるマクロを用意するかもしれません。