3

1) 私の C アルゴには多くの定数があります。2) 私のコードは浮動小数点と固定小数点の両方で動作します。

現在、これらの定数は関数 float2fixed によって初期化されており、浮動小数点では何もしませんが、固定小数点では固定小数点表現を見つけます。たとえば、浮動小数点で動作している場合、0.5f は 0.5f のままですが、pow() ルーチンを使用し、固定小数点で動作し、固定小数点表現が Qx.16 である場合は 32768 になります。

これは維持するのは簡単ですが、これらの定数を固定小数点で計算するには実際には多くの時間がかかります (pow は浮動小数点関数です)。C++ では、メタプログラミングを使用するので、コンパイラはこれらの値をコンパイル時に計算するため、実行時にヒットすることはありません。しかし、Cではそれは不可能です。またはそれは?そんな裏技知ってる人いますか?それを行うのに十分なほど賢いコンパイラはありますか?

回答をお待ちしております。

4

4 に答える 4

4

(unsigned)(x*pow(2,16))固定小数点変換を行う ために使用するのではなく、次のように記述します(unsigned)(0.5f * (1 << 16))

これは、組み込みの演算子のみを含むため、コンパイル時の定数式として受け入れられるはずです。

于 2009-06-10T23:32:09.160 に答える
2

固定小数点を使用する場合、浮動小数点値を取得して、それらを固定小数点タイプの正しい定数初期化子に変換するプログラムを作成できます。これにより、固定小数点値を生成するステップをコンパイルに効果的に追加できます。

これの利点の1つは、実行時に定数が変更されないように定数を定義および宣言できることです。const一方、初期化関数では、もちろん、値は1回計算されるため、変更可能である必要があります。


つまり、次のような定型行をスキャンできる簡単なプログラムを作成します。

const double somename = 3.14159;

それを読み取って生成します:

const fixedpoint_t somename = { ...whatever is needed... };

両方の表記を簡単に管理できるように操作を設計します。そのため、コンバーターは常にファイルを読み取り、場合によってはファイルを書き換えます。

datafile.c:   datafile.constants converter
        converter datafile.constants > datafile.c
于 2009-06-10T23:29:40.473 に答える
0

プレーンCでは、できることはあまりありません。ある時点で変換を行う必要があります。コンパイラーは、コンパイル時にユーザーが提供する興味深い関数を呼び出すためのアクセス権を提供しません。理論的には、プリプロセッサを誘導してそれを実行することもできますが、それは完全な狂気への迅速な道です(つまり、マクロにpow()を実装する必要があります。これはかなり恐ろしいことです)。

私が考えることができるいくつかのオプション:

  1. ディスク上に永続キャッシュを維持します。少なくとも、それは一度だけ遅くなりますが、それでもロードする必要があります。破損していないことを確認してください。

  2. 別のコメントで述べたように、とにかくテンプレートメタプログラミングを使用し、C++コンパイラでコンパイルします。ほとんどのCは、C ++コンパイラで問題なく(おそらくより良く)動作します。

うーん、私が考えることができるのはそれだけだと思います。幸運を。

于 2009-06-10T23:11:03.617 に答える
0

GCCの最近のバージョン(約4.3)では、GMPとMPFRを使用して、定数であるより複雑な関数を評価することにより、コンパイル時の最適化を行う機能が追加されました。このアプローチにより、コードはシンプルで移植性が高くなり、コンパイラーが手間のかかる作業を行うことを信頼できます。

もちろん、実行できることには限界があり、アセンブリを確認せずに特定のインスタンスを最適化しているかどうかを知るのは難しいでしょう。しかし、それはチェックする価値があるかもしれません。変更ログの説明へのリンクは次のとおりです

于 2009-06-11T04:56:44.493 に答える