浮動小数点演算は、浮動小数点ユニットのないプロセッサでどのように実行されますか? たとえば、ローエンドの 8 ビット マイクロコントローラ。
4 に答える
この記事をご覧ください: http://www.edwardrosten.com/code/fp_template.html
(こちらの記事より)
まず、メモリ内で浮動小数点数を表現する方法を考える必要があります。
struct this_is_a_floating_point_number
{
static const unsigned int mant = ???;
static const int expo = ???;
static const bool posi = ???;
};
次に、この表現で基本的な計算を行う方法を検討する必要があります。一部は実装が簡単で、実行時にかなり高速になる場合があります (2 で乗算または除算することが思い浮かびます)。
割り算は難しいかもしれません。たとえば、ニュートン アルゴリズムを使用して答えを計算することができます。
最後に、テーブル内のスマート近似と生成された値により、実行時の計算が高速化される場合があります。
何年も前に、C++ テンプレートを使用して Intel 386 SX で浮動小数点計算を行うことができました。
結局、私は多くの数学と C++ を学びましたが、同時にコプロセッサを購入することにしました。
特に多項式アルゴリズムとスマート ルックアップ テーブル。サイン関数があるときにコサインまたはタン関数が必要な人は、浮動小数点演算に整数を使用することを考えるのに大いに役立ちました. テイラーシリーズも啓示でした。
浮動小数点ハードウェアのないシステムでは、CPU は、整数算術論理ユニットで実行される一連の単純な固定小数点算術演算を使用してそれをエミュレートします。
詳細については、Wikipedia のページをご覧ください: Floating-point_unit#Floating-point_library。
命令をエミュレートするのは実際にはCPUではありません。ローエンドCPUの浮動小数点演算は整数算術命令から作成され、コンパイラはそれらの命令を生成するものです。基本的に、コンパイラ (ツール チェーン) には、浮動小数点関数を含む浮動小数点ライブラリが付属しています。
http://www.worldofspectrum.org/documentation.htmlの「The complete Spectrum ROM disassembly」を読んで、8 ビット Z80 プロセッサでの浮動小数点計算の例を確認してください。
正弦関数などの場合、いくつかの値を事前に計算してから、チェビシェフ多項式を使用して補間します。