LINUX.ORG.RU

[gcc] [cpp] [double] отнимаем и получаем [nan]

 


0

0
inline static double statTkrit(int c1, double a1, double d1,int c2,double a2,double d2,double &tp)
{
    /*long*/ double temp=0;
    tp=0;
    //temp=abs(a1-a2)/sqrt(d1/c1+d2/c2);
    int df=c1+c2-2;
    if(!df) return 0.;
    double xt=(c1-1)*d1+(c2-1)*d2;
    if(!xt) return 0.;
//    temp=fabs(a1-a2);
    temp=a1-a2;
         temp=temp/sqrt((xt/df)*(1/c1+1/c2));
    if(df>50) df=50;
    int dfx=df-1;
    for(int i=0;i<11;i++)
    {
        if(temp<kv[dfx][i])
        {
            tp=p[i];
            break;
        }
    }
    return temp;


}

на


temp=a1-a2;

появляется nan,если значения а1 и а2 давольно близки

a1=167.69999999999999; a2=168;

$ gcc -v
Используются внутренние спецификации.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-linux-gnu/4.5.0/lto-wrapper
Целевая архитектура: i686-pc-linux-gnu
Параметры конфигурации: ../configure --prefix=/usr --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-gnu-unique-object --enable-lto --enable-plugin --disable-multilib --disable-libstdcxx-pch --with-system-zlib --with-ppl --with-cloog --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
Модель многопоточности: posix
gcc версия 4.5.0 20100520 (prerelease) (GCC) 

Как выйти из данной ситуации - статистика,окрулять нельзя.


Ответ на: комментарий от PolarFox

нежелательно, но было бы интересно узнать какой тогда тип использовать лучше, чтобы было больше цифр после запятой

guilder
() автор топика

> a1=167.69999999999999; a2=168;

temp=a1-a2;


Оно никак не может появляться здесь, никак -0.3 на NaN не похоже. Посмотрите лучше на следующую строчку, в частности на «1/c1+1/c2». c1 и c2 у вас целые и явно тут легко возникает 0. И потом в итоге у вас значение temp делится на корень от нуля.

Во-первых, в таких случаях надо явно указывать тип и писать 1.0/c1 + 1.0/c2. А во-вторых, при делении надо проверять, что в знаменателе не нуль.

GArik ★★★
()
Ответ на: комментарий от GArik

я же под отладкой специально смотрел. имменно на этой строчке и появляется, там вообще должен быть модуль от этой разности.

За 1.0 спасибо учту, но и с ним всёравно теже грабли

P.S. ПРоект довольно большой, здесь уже был топик с подобным траблом в 2007 году

guilder
() автор топика
Ответ на: комментарий от guilder

ВСЕГДА ВЕЗДЕ при вычитании одинаковых чисел получается 0. Ничего другого не может даже быть. Исправь строку с корнем, всё пересобери и посмотри заново.

GArik ★★★
()

[решено]

пролистав makefile ф не нашёл -lm добавил в свойства проекта

Make: make -lm -w в /home/guilder/QtProjects/Students

guilder
() автор топика
Ответ на: комментарий от guilder

>1. там нулей быть не может, я не считаю критерий если у меня хоть одна из выборок ноль.

Выражение (1/c1+1/c2) будет равно нулю при с1>1 и c2>1.

pathfinder ★★★★
()
Ответ на: комментарий от PayableOnDeath

Упс, я проглядел описание типов. Ты прав.

LamerOk ★★★★★
()
Ответ на: комментарий от pathfinder

уже всё поправили и всё считает - просто надо писать всё вовремя.. а не скоростной суточный забег здачи норматива на количество багов, дабы было что потом исправлять.

guilder
() автор топика

Как выйти из данной ситуации - статистика,окрулять нельзя.

Чтоа? При всем желание ты не можешь считать точнее, чем позволяет double, то есть уже есть округление.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

nan получается если компилить без -lm

guilder
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.