С Новым годом! Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 84
1

Исправить ошибку NaN

30.06.2014, 01:05. Показов 4571. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При значениях n от 0 до 17 все нормально, от 18 и до 30 сумму Sn и отклонение от функции пишет NaN.
Pascal
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
Program Prog1;
 Uses 
    Crt;
 var
   x : double;
   n : integer;
 const
   eps = 0.001;
   x1 = 0.1;
   x2 = 1;
//функция для вычисления факториала   
  Function fact(n : integer) : integer;
  begin
    if n <= 1 then
      fact := 1
    else
      fact := n * fact(n - 1);
  end;
//величина ф-ции  
  Function Func(x : double) : double;
  begin
    Func:= (1-(power(x,2)/2))+cos(x)-(x/2)*sin(x);
  end;
//сумма от i=1 до n  
  Procedure Sn(x : double; n : integer);
  var
   i:integer;
   s, s2: double;
  begin
   S:=0;
   for i:=0 to n do
      S:= S + (power(-1,i)*(2*power(i,2))+1)*power(x,2*i)/fact(2*i);
      s2:= Func(x)-s;
   Write('Сумма Sn = ',S);
   WriteLn(', отклонение от ф-ции = ',S2);
  end; 
//сумма с точностью eps=0,001  
  Procedure Seps(x : double);
  var
  s,s2, member : double;
  i : integer;
  begin
   member:= power(-1,i)*(2*sqr(i)+1)*power(x,2*i)/fact(2*i);
   i:=1;
   s:=member;
   While member > eps do
   begin
      i:=i+1;
      member:=power(-1,i)*(2*sqr(i)+1)*power(x,2*i)/fact(2*i);
      S:=s+member;
   end;
   s2:=Func(x)-s;
   Write('Сумма Seps = ', s:2:2);
   Write(', кол-во элементов = ', i);
   Write(', отклонение ф-ции =  ',s2:2:2);
   WriteLn();
  end; 
//процедура вывода  
  Procedure OutPut(x : double; n : integer);
  begin
     clrscr;
     WriteLn('====================================');
     WriteLn('//////////////////////////////////////');
     WriteLn('====================================');
     WriteLn('При х = ',x,', n = ',n,', eps = 0,001:');
     Seps(x);
     Sn(x,n);
     WriteLn('Значение ф-ции : ',Func(x):2:2);
     WriteLn();
  end;
  
 begin
//ввод исходных данных
   Write('Введите значение 0 < n < 30: ');
   ReadLn(n);
   While (n<0) or (n>30) do
      begin
         Write('Введите правильное значение n > 0: ');
         ReadLn(n);
      end;
      
   Write('Введите значение х в диапазоне от 0.1 до 1: ');
   ReadLn(x);
   While (x>x2) or (x<x1) do
      begin
         Write('Введите значение х в диапазоне от 0.1 до 1: ');
         ReadLn(x);
      end;
   ClrScr;
   OutPut(x,n);
   OutPut(x1,n);
   OutPut(x2,n);
   ReadLn(); 
 end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2014, 01:05
Ответы с готовыми решениями:

Исправить ошибку
Program Rgr; uses crt; const M=5; type mas=array of Extended; var x,y :mas;...

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

Исправить ошибку
var y: array of real; i,fac,n: integer; min: real; s,x,z: real; f: text; ...

исправить ошибку
Напечатать текст, за которым следует точка. В алфавитном порядке напечатать все строчные русские...

7
Модератор
10065 / 5407 / 3353
Регистрация: 17.08.2012
Сообщений: 16,549
30.06.2014, 02:54 2
Лучший ответ Сообщение было отмечено avanesh как решение

Решение

avanesh, это не ошибка. Это ограничение разрядной сетки компьютера. И открою Вам страшный секрет: у Вас не до 17 всё нормально, а только до 12. Почему?

Максимальное значение типа integer в Turbo Pascal - это 231-1. Сравниваем:

231-12147483647
12!
479001600
13!6227020800

Как видите, в тип integer влезает только 12!. Если бы Вы писали программу не в Turbo Pascal, а в ином паскале (например, Free Pascal), Вам бы был доступен тип int64, максимальное значение которого 263-1, и uint64, максимальное значение которого 264-1. Но и в этом случае далеко бы не ушли:

263-1
9223372036854775807
264-1
18446744073709551616
20!
2432902008176640000
21!51090942171709440000

То есть, максимум, что поместится в стандартную разрядную сетку представления целых чисел в компьютере - это 20!.

Если тип функции fact объявить real, то можно будет расширить границы вычисления факториала, не помню, что-то до 61!, что ли... Но за счёт потери точности - количество значащих разрядов в мантиссе числа ограничено. Максимум максиморум - 20 разрядов, и безошибочно может быть представлен только 24!=620448401733239439360000, и то при его вычислении нагребёшь ещё и ошибок усечения при переводе из десятичных чисел в двоичные.

Достаточно простой выход из данной ситуации - производить вычисления методами длинной арифметики. А это радикальное перепахивание всей программы, да ещё, к тому же, не так всё и просто в этой длинной арифметике. Не рекомендую, лучше расскажите при сдаче задания, почему оно не считает, ну, хотя бы то, что я здесь написал.

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

Укажите, что делает программа - некогда мне с нею разбираться - может быть, перелопачу для Вас её, чтобы NAN не случалось.
1
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 84
30.06.2014, 03:12  [ТС] 3
Спасибо за объяснения.
Задание таково: найти функциональную сумму ряда для кол-ва членов от 1 до 30 слагаемых, сумму с точностью до Е=0.001 и кол-во просуммированных элементов, значение функции своего варианта а также отклонение полученных сумм от результата функции.
Писал на PascalABC, NaN появляется только с 18 по 30.

Ошибся. Не до 30, а до 18.
0
Модератор
10065 / 5407 / 3353
Регистрация: 17.08.2012
Сообщений: 16,549
30.06.2014, 04:00 4
https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
S\ =\ \sum_{i=0}^{\infty}\ (-1)^i\ \cdot \ \frac{2i^2+1}{(2i)!}\ \cdot \ x^{2i}<br />

Такой ряд?
1
Почетный модератор
64303 / 47600 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
30.06.2014, 09:04 5
Для вычисления суммы таких рядов не нужно ни факториал ни степень, все решается через рекуррентные отношения.
1
908 / 756 / 833
Регистрация: 06.09.2013
Сообщений: 1,561
30.06.2014, 14:19 6
При вычислении факториала большого числа можно было бы воспользоваться BigInteger, например:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{$reference 'System.Numerics.dll'}
 
uses 
  Crt, System.Numerics;
 
var
  N: uint64;
  fact: BigInteger;
  
begin
  write('N = ');
  readln(N);
  writeln;
  fact := new BigInteger(N);
  fact := N;
  for var i := N - 1 downto 2 do
    fact := fact * i;
  TextColor(LightGreen);
  write(N, '! = ');
  TextColor(Yellow);
  writeln(fact);
  writeln;
  TextColor(LightRed)
end.
А по ходу преобразовать в действительное R: R := StrToFloat(fact.ToString). Но это лишняя морока, поскольку вычислять факториал сразу нужно в действительных числах, тогда переполнения при малых значениях n не будет. Я всегда для факториала ставлю вещественный тип
1
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 84
30.06.2014, 16:57  [ТС] 7
Спасибо, поменял в строке
Pascal
1
Function fact(n : integer) : integer;
integer на real и NaN исчез.
0
Модератор
10065 / 5407 / 3353
Регистрация: 17.08.2012
Сообщений: 16,549
30.06.2014, 20:26 8
avanesh, так такой ряд или нет?
0
30.06.2014, 20:26
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2014, 20:26
Помогаю со студенческими работами здесь

Исправить ошибку
Выведите три столбика таблицы умножения рядом на n, n+1 и n+2, где n целое цичло и 1&lt;=n&lt;=7. Иначе...

Исправить ошибку
Нужно вывести тех, у кого одинаковый рост и вес... вот мои наработки, но что-то не получается((...

Исправить ошибку
Задание - написать прогу поиска наименьшего среди тех элементов одномерного массива, которые лежат...

Исправить ошибку!
Помогите исправить ошибку !!


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru