Результат вычисления: -1. # IND000000000000 в Visual C ++ Express 2010 - PullRequest
0 голосов
/ 06 января 2012

Я получил неправильный результат в уравнении, которое использовал в следующем коде

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

Все переменные объявлены как DOUBLE, где

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

dQ_rad получит результат -1. # IND000000000000, чего я действительно не понимаю. Затем я использовал то же уравнение в «QuickWatch», правильный результат можно увидеть следующим образом (!?)

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

Кто-нибудь знает, как произошла эта ошибка и как я могу избежать такой ошибки?

Я использую VC Express 2010, и код компилируется с использованием стандартного MS C-Compiler.

Большое спасибо

1 Ответ

1 голос
/ 07 января 2012

-1.#IND000000000000 является представлением Microsoft NaN.NaN может возникнуть из-за различных операций, таких как sqrt(-1.0), log(-1.0), 0/0, 0*INF, INF/INF.NaN также распространяется, поэтому любая операция над двойником со значением NaN перезапустится в 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;
}

Один из вариантов, который вы можете попробовать, - разделить вычисление 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...