-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
.