С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 07.01.2017
Сообщений: 69

Ошибка -nan при вызове математического выражения

03.04.2019, 08:29. Показов 763. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача всего этого взять интеграл функции от 0 до 1.
Main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Float quanc(Float x){
  return (1-exp(-0.8*x))/(x+1.6*x*x);
}
 
void findA(Float A){
  int nofR=0;
  Float a=0.0;
  Float b=1.0;
  Float errR=0;
  Float abser=0;
  Float relerr=1.0e-10;
  A=Q(quanc,a,b,abser,relerr,&errR,&nofR,&flag);
  //A=(Aa-0.40874702)*(Aa-0.40874702)*(Aa-0.40874702)*(Aa-0.40874702);
  cout << "Value program Q: A= " << A << " flag=" << flag << endl;
}
 
int main(){
  findA(A);
}
исходик спп

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "forsythe.h"
#include <math.h>
 
Float Quanc8(Float (*F)(Float), Float a, Float b, Float ae, Float re, Float *errest, int *nofun, Float *flag)
{
    const Float w0 = (Float)3956/(Float)14175,
                w1 = (Float)23552/(Float)14175,
                w2 = (Float)(-3712)/(Float)14175,
                w3 = (Float)41984/(Float)14175,
                w4 = (Float)(-18160)/(Float)14175;
    Float result = 0.0, area = 0.0, x0 = a, f0, stone = (b-a)/(Float)16, step, cor11 = 0.0, qprev = 0.0, qnow, qdiff, qleft, esterr, tolerr,
        qright[31], f[16], x[16], fsave[8][30], xsave[8][30];
 
    //*** ЭТАП 1 *** Присвоение начальных значений переменным, не зависящим от интервала. Генерирование констант.
    #define LEVMIN  1
    #define LEVMAX  30
    #define LEVOUT  6
    #define NOMAX   5000
    int levmax = LEVMAX, nofin = NOMAX - 8*(LEVMAX-LEVOUT+(1<<(LEVOUT+1))),//Если '*nofun' достигает значения 'nofin', то тревога
        lev = 0, nim = 1, i, j;
 
    //Присвоить нулевые значения переменным суммам
    *flag = 0.0;
    *errest = 0.0;
    *nofun = 0;
 
    if(a == b) return 0.0;
 
    //*** ЭТАП 2 *** Присвоение начальных значений переменным, зависящим от интервала, в соответствии с первым интервалом
    x[15] = b;
    f0 = F(x0);
    x[7] = (x0+b)/(Float)2;
    x[3] = (x0+x[7])/(Float)2;
    x[11] = (x[7]+b)/(Float)2;
    x[1] = (x0+x[3])/(Float)2;
    x[5] = (x[3]+x[7])/(Float)2;
    x[9] = (x[7]+x[11])/(Float)2;
    x[13] = (x[11]+b)/(Float)2;
 
    for(j=1;j<=15;j+=2) f[j] = F(x[j]);
    *nofun = 9;
 
    //*** ЭТАП 3 *** Основные вычисления
    while(1)
    {
        x[0] = (x0+x[1])/(Float)2;
        f[0] = F(x[0]);
        for(j=2;j<=14;j+=2)
        {
            x[j] = (x[j-1]+x[j+1])/(Float)2;
            f[j] = F(x[j]);
        }
        nofun += 8;
        step = (x[15]-x0)/(Float)16;
        qleft = (w0*(f0+f[7]) + w1*(f[0]+f[6]) + w2*(f[1]+f[5]) + w3*(f[2]+f[4]) + w4*f[3]) * step;
        qright[lev] = (w0*(f[7]+f[15]) + w1*(f[8]+f[14]) + w2*(f[9]+f[13]) + w3*(f[10]+f[12]) + w4*f[11]) * step;
        qnow = qleft + qright[lev];
        qdiff = qnow - qprev;
        area += qdiff;
 
        //*** ЭTAП 4 *** Проверка сходимости для интервала
        esterr = ABS(qdiff)/(Float)1023;
        tolerr = MAX(ae, re*ABS(area))*(step/stone);
 
        if(lev < LEVMIN || ((lev < levmax) && (*nofun <= nofin) && (esterr > tolerr)))
        {
            //*** ЭTAП 5 *** Сходимости нет. Установить следующий интервал
            nim <<= 1;
            lev++;
            //Запомнить элементы, относящиеся к правой половине интервала, для будущего использования
            for(i=0;i<8;i++)
            {
                fsave[i][lev-1] = f[i+8];
                xsave[i][lev-1] = x[i+8];
            }
            //Собрать элементы, относящиеся к левой половине интервала для немедленного использования
            qprev = qleft;
            for(i=7;i>=0;i--)
            {
                f[i*2+1] = f[i];
                x[i*2+1] = x[i];
            }
            continue;
        }
 
        if(lev >= levmax) *flag += (Float)1.0;
        else if(*nofun > nofin)
        {
            nofin <<= 1;
            levmax = LEVOUT;
            *flag += (b-x0)/(b-a);
            //Текущее предельное значение глубины деления пополам равно 'levmax'
        }
 
        //*** ЭTAП 7 *** Сходимость для интервала имеет место. Прибавить очередные слагаемые к переменным суммам
        result += qnow;
        *errest += esterr;
        cor11 += qdiff/(Float)1023;
 
        //Установить следующий интервал
        while(nim & 1)//если nim - нечётное
        {
            nim /= 2;
            lev--;
        }
        nim++;
        if(lev <= 0) break;
 
        //Собрать элементы, необходимые для следующего интервала
        qprev = qright[lev-1];
        x0 = x[15];
        f0 = f[15];
        for(i=0;i<8;i++)
        {
            f[i*2+1] = fsave[i][lev-1];
            x[i*2+1] = xsave[i][lev-1];
        }
    }
 
    //*** ЭTAП 8 *** Заключительные операции и выход
    result += cor11;
    //Обеспечить, чтобы значение переменной '*errest' было не меньше уровня округлений
    if(*errest == (Float)0.0) return result;
    Float temp;
    while(1)
    {
        temp = ABS(result) + *errest;
        if(temp != ABS(result)) return result;
        *errest *= (Float)2;
    }
}
исходник хэдр
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef __FORSYTHE_H__
#define __FORSYTHE_H__
 
#include <float.h>
 
#define FT_FLOAT    0   //'float'
#define FT_DOUBLE   1   //'double'
#define FT_LDOUBLE  2   //'long double'
 
//Здесь можно переопределить вещественный тип, который будет использоваться в вычислениях.
//Если важна скорость - используйте 'float' (т.е. FT_FLOAT), если нужна точность - используйте 'double' (FT_DOUBLE)
//или 'long double' (FT_LDOUBLE).
#define FLOATTYPE   FT_DOUBLE
 
#if FLOATTYPE == FT_FLOAT
    typedef float Float;
    #define EPSILON FLT_EPSILON
    #define MAXIMUM FLT_MAX
#elif FLOATTYPE == FT_DOUBLE
    typedef double Float;
    #define EPSILON DBL_EPSILON
    #define MAXIMUM DBL_MAX
#elif FLOATTYPE == FT_LDOUBLE
    typedef long double Float;
    #define EPSILON LDBL_EPSILON
    #define MAXIMUM LDBL_MAX
#else
    #error Invalid Float Type
#endif
 
//Некоторые полезные макросы
#define ABS(x) (((x) >= 0) ? (x) : -(x))
#define MAX(x, y) (((x) >= (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define SIGN0(x) (((x) > 0) ? 1 : -1)
#define SIGN(x) (((x) == 0) ? 0 : SIGN0(x))
#define SIGN2(a, b) (SIGN(b)*ABS(a))
 
 
Float Quanc8(Float (*F)(Float), Float a, Float b, Float ae, Float re, Float *errest, int *nofun, Float *flag);
Float=float, это преобразование в исходниках. Проблема при выводе flag=0.5, Q=-nan. исходники не подлежат изменению, только main.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2019, 08:29
Ответы с готовыми решениями:

Ошибка при вычислении математического выражения
(3^|x-1|-sin2+sin2x)/(cos^2(1-x)+log^2(1+x))*(5-x) Проверочные числа 1 и 3! Вот что у меня получилось: Function My_name(X As...

Ошибка при исчислении математического выражения
Вот нужно вычислить следующее выражение но при выполнении возникает ошибка. Что неправильно? Error(s), warning(s): *** - READ: input...

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора с параметром const String &amp;,...

4
0 / 0 / 0
Регистрация: 14.12.2019
Сообщений: 15
18.03.2021, 18:43
Markontr, добрый я вижу вы работаете с библиотекой Forsythe.h, если вам не трудно могли бы вы подсказать как подключить ее в ну visual studio например?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
18.03.2021, 19:12
Цитата Сообщение от Markontr Посмотреть сообщение
return (1-exp(-0.8*x))/(x+1.6*x*x);
При x=0 знаменатель равен нулю, поэтому и NaN
C++
1
2
3
4
Float quanc(Float x){
  if(x==0)return 1.0;
  return (1-exp(-0.8*x))/(x+1.6*x*x);
}
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
18.03.2021, 23:21
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
4
Float quanc(Float x){
 if(x==0)return 1.0;
 return (1-exp(-0.8*x))/(x+1.6*x*x);
}
А если x == 0.0000000001 ?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
19.03.2021, 07:23
Цитата Сообщение от jugu Посмотреть сообщение
если x == 0.0000000001 ?
Вполне себе поделится (NaN не появится).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2021, 07:23
Помогаю со студенческими работами здесь

NAN при вычислении выражения
program z1; uses crt; var x,z,s:real; n,k,i,o,fact:integer; begin write('Введите число x '); read(x); fact:=1; z:=1; ...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове...

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

Ошибка NAN при расчетах
Исправьте, пожалуйста, ошибку nan. Когда вводятся числа 0,0, -3 #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include...

Ошибка NaN при вычислениях
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru