2012-01-06 15 views
0

私はすべての変数が計算結果:-1のVisual C++ Expressの#のIND000000000000 2010

DOUBLE、として宣言されている私の次のコード

dQ_rad = 0.7 * 5.67e-8 * rotor.dRotorOuterArea[iAxle] * (dT1*dT1*dT1*dT1 - dT2*dT2*dT2*dT2); 

で使用される式で間違った結果を得ました

rotor.dRotorOuterArea[iAxle] = 0.052986887100527499 
dT1 = 0; 
dT2 = 293.0; 

dQ_radは-1を返します。#IND000000000000、これは私が実際に理解していないものです。私は「クイックウォッチ」に同じ式を使用し、次のように続いて、正しい結果を見ることができる(!?)

0.7 * 5.67e-8 * rotor.dRotorOuterArea[iAxle] * (dT1*dT1*dT1*dT1 - dT2*dT2*dT2*dT2) -15.499582013297069 double 

私はこの種のエラーを回避することができますどのように誰もこのエラーが起こったのかを知っているとしていますか?

私はVC Express 2010を使用しており、コードはデフォルトのMS Cコンパイラを使用してコンパイルされています。

感謝

+0

デバッグとリリースのビルドで同じ結果が得られますか? –

+0

#INDは愚かなCRTデバッグであり、#INFを読み込む必要があります。あなたはゼロで割ることで無限を得るでしょう。私たちが自分で試すことができるコードスニペットを投稿してください。 –

+0

「リリース」の設定を使用すると違いがありますか?なぜなら、私はいつも "デバッグ"モードを使用しているからです。 – OISS

答えて

1

-1.#IND000000000000NaNのMicrosoftの表現です。 NaNは、sqrt(-1.0),log(-1.0),0/0,0*INF,INF/INFなどのさまざまな操作のために発生する可能性があります。 NaNも伝搬されるので、値がNaNのdouble上の操作はNaNに戻ります。次の記事では、この詳細情報(およびその他の浮動小数点状態)を提供し、この問題をデバッグ中に価値がある:

残念ながら

http://www.johndcook.com/IEEE_exceptions_in_cpp.html

、私は些細なテストケースでは、あなたのエラーを再現することができませんでしたより詳細な情報を提供することは困難である:あなたが試みることができる

#include <stdio.h> 

int main(void) { 
    double rotor = 0.052986887100527499; 
    double dT1 = 0; 
    double dT2 = 293.0; 

    double dQ_rad = 0.7 * 5.67e-8 * rotor * (dT1*dT1*dT1*dT1 - dT2*dT2*dT2*dT2); 
    //fprintf(stderr, "%.12lf\n", dQ_rad); 

    return 0; 
} 

1つのオプションは、複数のステップにあなたのdQ_rad計算を分割し、それがNaNではないことを確認するために、各操作の結果を確認することです。ような何か:

double dQ_rad1 = 0.7 * 5.67e-18; 
double dQ_rad2 = dQ_rad1 * rotor; 
double dQ_rad3 = dT1*dT1*dT1*dT1; 
double dQ_rad4 = dT2*dT2*dT2*dT2; 
double dQ_rad5 = dQ_rad3 - dQ_rad4; 
double dQ_rad = dQ_rad2 * dQ_rad5; 

これはNaNが得られている計算のどの部分に分離するのを助けることができます。

+0

こんにちは、ありがとうございます。少なくともVS Express 2010のCコンパイラを使用している私のコンピュータでは、エラーが再現可能で、それはまさに私が理解できないものです。 最初の考えは、フォーミュラを別の部分に分割してデバッグすることでした。しかし、私が上に書いたのは、この種の計算でいっぱいの膨大なファイルの単純な部分です。すべての形式をデバッグすることは非常に困難です。 今私は、エラーがCコンパイラから来ているかどうかを疑う。 VC ExpressにはCとC++のどちらかを選択する設定オプションがあります。私はC++コンパイラを使用して問題を解決できるかどうか疑問に思っています。 – OISS

+0

私はCとC++の両方で上記の例を試しましたが、失敗を再現できませんでした。いくつかの浮動小数点計算はコンパイラオプションの影響を受けることがありますので、あなたのアプリケーションをコンパイルするためにコマンドラインを使用することをお勧めします。使用しているプロセッサに浮動小数点計算に関連する既知の問題があるかどうかを調べることもできます。 – DRH

+0

こんにちは、今、私は問題を解決しました。これは、この問題の原因となった関数呼び出しの失敗です。 – OISS

関連する問題