質問

誰かが助け、どのようにMSVC ++ 6でIEEE数学関数を含めることを教えていただけますか?私は両方を試してみましたが、私はまだ、これらのエラーを取得します:

  

エラーC2065: 'ilogbf':宣言されていない識別子

     

エラーC2065: 'scalbnf':宣言されていない識別子

役に立ちましたか?

解決

編集3:うまくいけば、これが私の最後の編集になります。私は適切ではすべてこの問題に対処していないことを認識するようになりました。それはいくつかの教育的価値を有することができるので、私は訓話としての場所に私の答えを残していく、としています。しかし、私はゼロupvotesを持っている理由私は理解し、私は彼がはるかに関連する(不完全少なくとも記事の執筆時点ではあるが)あると思うので、実際には、私はアンディ・ロスの答えをupvoteするつもりです。私のミスが少し表面的に)(私はilogbf見つかりマンの定義を取ることだった私には思えます。それは、フロートのログの整数部分をとる関数ですが、どのように難しいことでは実装することができますか?これは、関数がIEEE浮動小数点表現、特に指数(仮数ではなく)その表現の一部である約本当に何であるかが判明しました。私は間違いなく、質問に答えることを試みる前にそれを実現している必要があります!私には興味深い点は、私はCの基本的なルールは、フロートは、関数呼び出しの一部としてダブルスに昇格されていることであると思ったとしての機能はおそらく、フロートの指数部を見つけることができる方法です。しかし、それは当然の全体の別の議論だ。

編集3の

---終わり、訓話の開始---

少しグーグルでは、これらはいくつかのUnix系で定義されていますが、多分任意のPosixのか、ANSI規格ではありませんので、MSVCライブラリで提供されていません示唆しています。機能がライブラリにない場合、それらはmath.h.で宣言されることはありませんコンパイラは、これらの外部シンボルの宣言を見ることができない場合は明らかにそれが幸せではないだろうと、あなたがリストのもののようなエラーを取得します。

明白な回避策は、<全角> が用意されている数学関数を使用して、これらの機能の独自のバージョンを作成することです。例えば、

#include <math.h>

int ilogbf( float f )
{
    double d1 = (double)f;
    double d2 = log(d1);
    int ret = (int)d2;
    return ret;
}

編集:これは非常に適切ではありません。返された値が実際にバイナリの指数であるように、どうやら、この機能は、むしろ自然のログよりも、ベース2にログを使用する必要があります。それは同様に負の数のために働くように、それはまた、そのパラメータの絶対値を取る必要があります。あなたはコメントで私に言わせれば、私はそう私は読者の演習として残しておきたくなるんだ、改良版を動作します: - )

ANSI Cはこの機能を必要とせず、MSVCは、それが含まれていないというのが私の答えの本質、つまりは、明らかに正しいです。

編集2:わかりました、私は弱体化して求められることなく改良版を提供してきました。ここにある;

#include <math.h>

int ilogbf( float f )
{
    double d1 = (double)f;
    if( d1 < 0 )
        d1 = -d1;
    double d2 = log(d1) / log(2);  // log2(x) = ln(x)/ln(2)
    int ret = (int)d2;
    return ret;
}

他のヒント

これらは、C99の機能ではなく、IEEE754-1985です。マイクロソフトは、その市場はC99のサポートを気にしないことを決めたようだので、彼らはそれらを提供するために困っていません。これは残念ですが、あなた(開発者)のよりは文句ない限り、状況が変わることを期待する理由はありません。

真新しい754標準、IEEE754-2008は、(節5.3.3、「logBFormat操作」)、これらの機能を必要としますが、標準のバージョンが広く、数年以上に採用されることはありません。それが広く採用に達しない場合でも、Microsoftはなぜ彼らはIEEE754標準にしているという理由だけで、それらを提供するために、わざわざ彼らはC99にしてきた10年間、これらの機能を提供するために、フィット見ていない?

編集のIEEE754-1985 の付録の「推奨される関数と述語」で定義されているつまり、scalbとlogbに注意しますが、付録には、明示的に「の一部ではない」と述べています標準は述べています。

あなたはIEEEシステムにしている知っている場合(および、これらの日、あなたが)、これらの機能は必要ありません。ただuint64_tをして、二重に合併することにより、直接ビットを検査します。おそらくあなたはとても浮動小数点表現にあなたのコードの一致に少しの努力を費やして、(そうでなければ、log()またはexp()ような、より自然な操作を使用しているはずだ)最初の場所での効率の利益のために、これらの機能を使用していることはおそらく価値があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top