Ошибка распознавания формулы nan

Ar0x

0 / 0 / 1

Регистрация: 22.10.2014

Сообщений: 6

1

19.12.2014, 00:13. Показов 4474. Ответов 2

Метки нет (Все метки)


Всем добрый день! есть такое задание
Произвести расчет по заданным формулам. Величины x, y, z принадлежат множеству действительных чисел. В случае несуществования результирующих значений переменных а и b при заданых x, y, z выдать уведомление про ошибку.

Формулы:

a=(cos(1+x+x^2/2)/sin(y-x^2+z))^|x|
[23:11:41] Andrey Ruban: b=1-arctg z+arctg z^3/3*x-y

Сам код:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program lab1;
    uses Crt;
    var a,b,x,y,z: real;
begin 
clrscr;
a:=0;b:=0;
    writeln('Enter x: ');
    readln(x);
    writeln('Enter y: ');
    readln(y);
    writeln('Enter z: ');
    readln(z);  
    if sin(y-x*x+z)<>0 then writeln('a = ',exp(abs(x)+ln(cos(1+x+x*x/2)/sin(y-x*x+z))):3:3)
            else writeln('Cant count a');
    if (3*x-y)<>0 then writeln('b = ',1-arctan(z)+(arctan(z*z*z)/3*x-y):3:3)
            else writeln('Cant count b');
    readln;
end.

И собственно вопрос — почему при некоторых значениях со знаком «-» или 0 выдает значение NaN. Хотя я же написал с поправками на значение 0 в знаменателе. Спасибо.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

19.12.2014, 00:13

2

bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7481 / 4353 / 2771

Регистрация: 22.11.2013

Сообщений: 12,480

Записей в блоге: 1

19.12.2014, 00:33

2

NaN — это «not a number», получается при 0/0.

Кстати, приведите примеры значений, когда NaN получается.

PS. Кстати, чтобы вставить в строку апостроф, достаточно его задвоить:

Pascal
14
else writeln('Can''t count a');
Pascal
16
else writeln('Can''t count b');

Добавлено через 7 минут
Да и близких к 0 значений достаточно для фиксации этой неопределенности, как пример:

Pascal
1
2
3
4
5
6
7
{$N+}
var
  n1, n2: Extended;
begin
  n1:=1e-4932; n2:=1e-4932;
  WriteLn(n1/n2);
end.

Код

                    NAN

1

Супер-модератор

6108 / 2847 / 1299

Регистрация: 04.03.2013

Сообщений: 5,738

Записей в блоге: 1

20.12.2014, 13:58

3

К операциям, приводящим к появлению NaN в качестве ответа, относятся:

  • все математические операции, содержащие NaN в качестве одного из операндов;
  • деление ноля на ноль;
  • деление бесконечности на бесконечность;
  • умножение ноля на бесконечность;
  • сложение бесконечности с бесконечностью противоположного знака;
  • вычисление квадратного корня отрицательного числа;
  • логарифмирование отрицательного числа.

Свойства NaN:

  • NaN не равен ни одному другому значению (даже самому себе); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.
  • Любая нетривиальная операция, принимающая NaN как аргумент, всегда возвращает NaN вне зависимости от значения других аргументов. Единственными исключениями из этого правила являются функции max и min, которые возвращают значение «второго» аргумента (отличного от NaN).
  • Тривиальные операции, являющиеся тождеством, обрабатываются особо: так, например, 1NaN равно 1

3

NaN в JavaScript

От автора: В данной статье мы познакомимся со специальным свойством NaN (Not-A-Number), которое является значением, представляющим не-число.

Тип числа в JavaScript содержит целые числа и числа с плавающей запятой:

const integer = 4;

const float = 1.5;

typeof integer; // => ‘number’

typeof float;   // => ‘number’

Плюс есть два специальных числовых значения: Infinity (число больше, чем любое другое число) и NaN (представляющее концепцию «не число»):

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

const infinite = Infinity;

const faulty = NaN;

typeof infinite; // => ‘number’

typeof faulty;   // => ‘number’

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

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

1. Число NaN

Тип числа в JavaScript — это набор всех числовых значений, включая «не число», положительную бесконечность и отрицательную бесконечность.

«Not A Number» можно получить с помощью специального выражения NaN или как свойство глобального объекта или функции Number:

typeof NaN;        // => ‘number’

typeof window.NaN; // => ‘number’

typeof Number.NaN; // => ‘number’

«Не число» — это значение, которое не представляет действительное число, несмотря на то, что оно имеет тип числа. Через NaN полезно представлять ошибочные операции с числами. Например, умножение числа на undefined не является допустимой операцией, поэтому дает NaN:

Также попытка разобрать недопустимую числовую строку, например, ‘Joker’ приводит к NaN:

parseInt(‘Joker’, 10); // => NaN

2. Проверка на равенство с NaN

Интересным свойством NaN является то, что оно не равно ни одному значению, даже самому себе:

Это поведение полезно для определения, является ли переменная NaN:

const someNumber = NaN;

if (someNumber !== someNumber) {  console.log(‘Is NaN’);

} else {

  console.log(‘Is Not NaN’);

}

// logs «Is NaN»

Выражение someNumber !== someNumber равно true, только если someNumber является NaN. Таким образом, приведенный выше фрагмент регистрирует в консоли «Is NaN». JavaScript содержит встроенные функции для определения NaN: isNaN() и Number.isNaN():

isNaN(NaN); // => true

isNaN(1);   // => false

Number.isNaN(NaN); // => true

Number.isNaN(1);   // => false

Разница между этими функциями заключается в том, что Number.isNaN() не преобразуется свой аргумент в число:

isNaN(‘Joker12’);        // => true

Number.isNaN(‘Joker12’); // => false

isNaN(‘Joker12’) преобразует аргумент ‘Joker12’ в число, которое является NaN. Таким образом, функция возвращает true.

С другой стороны, Number.isNaN(‘Joker12’) проверяет аргумент без преобразования. Функция возвращает false, потому ‘Joker12’ не равно NaN.

3. Операции, дающие NaN

3.1 Парсинг чисел

В JavaScript вы можете преобразовать числовые строки в числа. Например, вы можете легко преобразовать строку ‘1.5’ в число с плавающей запятой 1.5:

const numberString = ‘1.5’;

const number = parseFloat(numberString);

number; // => 1.5

Когда строка не может быть преобразована в число, функция синтаксического анализа возвращает NaN: указывая, что синтаксический анализ не выполнен. Вот некоторые примеры:

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

parseFloat(‘Joker12.5’); // => NaN

parseInt(‘Joker12’, 10); // => NaN

Number(‘Joker12’);       // => NaN

При парсинге чисел рекомендуется проверить, не является ли результат парсинга NaN:

let inputToParse = ‘Invalid10’;

let number;

number = parseInt(inputToParse, 10);

if (isNaN(number)) {  number = 0;

}

number; // => 0

Парсинг inputToParse не удался, поэтому parseInt(inputToParse, 10) возвращается NaN. Условие if (isNaN(number)) оценивается, как true, и 0 назначается number.

3.2 undefined в качестве операнда

При использовании undefined в качестве операнда в арифметических операциях, таких как сложение, умножение и т д. мы получаем NaN. Например:

function getFontSize(style) {

  return style.fontSize;

}

const fontSize = getFontSize({ size: 16 }) * 2;

const doubledFontSize = fontSize * 2;

doubledFontSize; // => NaN

getFontSize() — это функция, которая обращается к свойству fontSize из объекта стиля. При вызове getFontSize({ size: 16 }) результатом будкт undefined (свойство fontSize не существует в объекте { size: 16 }). fontSize * 2 оценивается как undefined * 2, что дает NaN.

«Not A Number» генерируется, когда в качестве значения в арифметических операциях используется отсутствующее свойство или функция, возвращающая undefined. Отсутствие undefined в арифметических операциях — это хороший способ предотвратить получение NaN.

3.3 NaN как операнд

Значение NaN также генерируется, когда операндом в арифметических операциях является NaN:

1 + NaN; // => NaN

2 * NaN; // => NaN

NaN распространяется на арифметические операции:

let invalidNumber = 1 * undefined;

let result = 1;

result += invalidNumber; // appendresult *= 2;             // duplicate

result++;                // increment

result; // => NaN

Операции с переменной result прерываются после добавления к result значения invalidNumber (которое является NaN).

3.4 Неопределенные формы

Значение NaN создается, когда арифметические операции имеют неопределенные формы. Деление 0 / 0 и Inifinity / Infinity:

0 / 0;               // => NaN

Infinity / Infinity; // => NaN

Умножение 0 и Infinity:

Сложение бесконечных чисел с разными знаками:

Infinity + Infinity; // => NaN

3.5 Неверные аргументы математических функций

Квадратный корень из отрицательного числа:

Math.pow(2, 0.5); // => NaN

(2) ** 0.5;       // => NaN

Или логарифм отрицательного числа:

4. Заключение

Понятие «не число», выраженное в JavaScript с помощью NaN, полезно для представления ошибочных операций над числами. NaN не равно ни одному значению, даже самому себе. Рекомендуемый способ проверить, содержит ли переменная NaN — использовать Number.isNaN(value).

Преобразование числовых строк в числа, в случае неудачи может дать NaN. Рекомендуется проверять, не возвращают ли parseInt(), parseFloat() или Number() NaN.

Если undefined или NaN используются в качестве операнда в арифметических операциях, это обычно приводит к NaN. Правильная обработка undefined (предоставление значений по умолчанию для отсутствующих свойств) является рекомендованным подходом для предотвращения этой ситуации.

Неопределенные формы или недопустимые аргументы для математических функций также приводят получению NaN. Но это случается редко. Вот мой практический совет: «Получили NaN? Ищите undefined!»

Автор: Dmitri Pavlutin

Источник: //dmitripavlutin.com

Редакция: Команда webformyself.

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Смотреть

Что такое NaN?
NaN, аббревиатура от «Not a Number», является исключением, которое обычно возникает в тех случаях, когда выражение приводит к числу, которое невозможно представить. Например, квадратный корень из отрицательных чисел.

#include<iostream>

#include<cmath> // for sqrt()

using namespace std;

int main()

{

float a = 2, b = -2;

cout << sqrt (a) << endl;

cout << sqrt (b) << endl;

return 0;

}

Выход:

1,41421
-нан

Как проверить NaN?

Метод 1. Использование оператора сравнения («==»).
В этом методе мы проверяем, является ли число сложным, сравнивая его с самим собой. Если результат верен, то число не комплексное, то есть действительное. Но если результат ложный, то возвращается «нан», т.е. число комплексное.

#include<iostream>

#include<cmath> // for sqrt()

using namespace std;

int main()

{

float a = sqrt (2);

float b = sqrt (-2);

a==a? cout << "Its a real number" << endl:

cout << "Its NaN" << endl;

b==b? cout << "Its a real number" << endl:

cout << "Its NaN" << endl;

return 0;

}

Выход:

Its a real number
Its NaN


Метод 2: Использование встроенной функции isnan ().

Другой способ проверить NaN — использовать функцию «isnan ()», эта функция возвращает истину, если число сложное, иначе она возвращает ложь.

#include<iostream>

#include<cmath> // for sqrt() and isnan()

using namespace std;

int main()

{

float a = sqrt (2);

float b = sqrt (-2);

isnan(a)? cout << "Its NaN" << endl:

cout << "Its a real number" << endl;

isnan(b)? cout << "Its NaN" << endl:

cout << "Its a real number" << endl;

return 0;

}

Выход:

Это реальное число
Его NaN

Автором этой статьи является Манджит Сингх. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью с помощью метода влиятельности. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Нужно сделать программу, которая выводит результат вычисления выражения в консоль. Проблема в том, что результат выводится корректно, если присвоить значения переменным в коде программы. Но если ввести их с клавиатуры, то выводит nan. Код на Java.
Как исправить ошибку и сделать две такие же программы на C и C++ ?

    package Formula;
    import static java.lang.Math.pow;
    import java.util.Scanner;




    public class My_Program {
    public static void main(String[] args) {

        double m, a, res, s1, e, l1, s2, mod1, mod2, l2;
        System.out.println("Введите целое число х:");
        Scanner in= new Scanner (System.in);
        int x = in.nextInt();
        System.out.println("Введите целое число d:");
        int d = in.nextInt();
        System.out.println("Введите дробное число a. Целую и дробную часть разделите запятой:");
        a = in.nextDouble();
        System.out.println("Введите дробное число u. Целую и дробную часть разделите запятой:");
        m = in.nextDouble();

        s1= Math.pow(Math.sin( pow(d,3)),2);
        e=Math.exp(Math.abs(a-Math.tan(x)));
        mod1=Math.abs((1-s1)/(1.5+e));

        l1=pow(Math.log(pow(a,2)),3);
        s2=pow(Math.sin(d),2);
        mod2=Math.abs((m-l1)/(1+s2));
        l2=pow(Math.log(mod2)/Math.log(3),2);

        res=Math.acos (pow( mod1,0.3333)+Math.sqrt(2.7+l2));


        System.out.print("Входные данные rn");
        System.out.print("============== rn");
        System.out.printf("a =%.1f",a);
        System.out.print( "rn");
        System.out.printf("d = %d ",d);
        System.out.print( "rn");
        System.out.printf("x = %d",x);
        System.out.print( "rn");
        System.out.printf("U=%f",m);
        System.out.print("rn");
        System.out.print("Результат:rn");
        System.out.print("==============");
        System.out.print( "rn");
        System.out.printf("B= %f",res);
    }
}

I am working on a function for the quadratic formula in java eclipse mars, and when I compile the code it outputs NaN when mathematically this answer is possible and i should get 2.0 please help

import java.util.Scanner;
public class Quadradic1 {
    public static void main(String[] args) {    
        double a;
        double b;
        double c;
        double x;
        System.out.print("Input A B C: ");
        Scanner input = new Scanner(System.in);
        a = input.nextDouble();
        b = input.nextDouble();
        c = input.nextDouble();
        x = (-b + Math.sqrt(b * b + 4 * a * c))/(2 * a);
        System.out.println("Quadratic1 " + x);
    }
}

Sorry the values I entered are a=1 b=2 and c=-8

asked Sep 17, 2015 at 2:55

Kasual Koala's user avatar

2

For your inputs
b * b + 4 * a * c evaluates to -28. There is not such thing as the square root of a negative number

answered Sep 17, 2015 at 3:03

logee's user avatar

logeelogee

4,9971 gold badge26 silver badges34 bronze badges

1

I am working on a function for the quadratic formula in java eclipse mars, and when I compile the code it outputs NaN when mathematically this answer is possible and i should get 2.0 please help

import java.util.Scanner;
public class Quadradic1 {
    public static void main(String[] args) {    
        double a;
        double b;
        double c;
        double x;
        System.out.print("Input A B C: ");
        Scanner input = new Scanner(System.in);
        a = input.nextDouble();
        b = input.nextDouble();
        c = input.nextDouble();
        x = (-b + Math.sqrt(b * b + 4 * a * c))/(2 * a);
        System.out.println("Quadratic1 " + x);
    }
}

Sorry the values I entered are a=1 b=2 and c=-8

asked Sep 17, 2015 at 2:55

Kasual Koala's user avatar

2

For your inputs
b * b + 4 * a * c evaluates to -28. There is not such thing as the square root of a negative number

answered Sep 17, 2015 at 3:03

logee's user avatar

logeelogee

4,9971 gold badge26 silver badges34 bronze badges

1

В JS проверка на NaN затруднена там, что это тип данных, который равняется «ничем». NaN — это «Not a Number» и переводится как «не число». Обычно такое значение возвращается, когда невозможно завершить работу математической функции или когда в значении математической функции расположено «не число». На практике, NaN появляется тогда, когда в JS-скрипте появляется ошибка.

Может возникнуть простой вопрос: для чего в JavaScript NaN, если это не число, не строка и даже не «пустота»? NaN редко когда применяется специально. А его история возникновения тянется еще с первых лет создания JavaScript. Те, кто работает с JavaScript, знают, что это не строгий и многое прощающий язык программирования. NaN в него был введен для того, чтобы в случае возникающих ошибок в скрипте, программа не оканчивала собственное выполнение, а продолжала работать  вернув в качестве значения ошибки NaN.

Проверка на NaN в JS

Проверка на NaN в JS осложнена тем, что это значение не равняется ни какому другому значению, в том числе самому себе. То есть выражение «NaN===NaN» вернет «false». Поэтому проверка на NaN при помощи простого сравнения невозможна. Лучше уж применять функцию «isNaN()» или  метод «Number.isNaN()». Но и тот, и другой способ нужно применять осторожно, потому что каждый из них по-своему специфичен. Например:

  • функция «isNaN()» при проверке вернет «true» в двух случаях: если при проверке значение уже NaN и если оно станет NaN после попытки преобразования его в число;

  • метод «Number.isNaN()» вернет «true» только если значение при проверке уже является NaN.

В общем, с такими способами проверки может сложиться такая ситуация:

isNaN(‘Привет, Дормидонт!’); //в результате вернет «true»

Number.isNaN(‘Привет, Дормидонт!’); // в результате вернет «false»

Проверка на NaN в JavaScript: безотказный метод

Проверка на NaN в JS возможна, но для этого нужно выстраивать специфичные конструкции из кода. Например, можно попробовать такую конструкцию:

function sanitise(a) {

  if (isNaN(a)) {

     return NaN;

  }

  return a;

}

console.log(sanitise(‘тут введите какое-то значение’));

Вы можете попробовать этот скрипт в действии и в функции «console.log()» ввести разные значения: строки, числа, NaN, underfilled и др. Таким образом вы сможете убедиться, что такая проверка на NaN в JS работает безотказно.

Заключение

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

  • Редакция Кодкампа

17 авг. 2022 г.
читать 2 мин


Одна ошибка, с которой вы можете столкнуться при использовании pandas:

ValueError : cannot convert float NaN to integer

Эта ошибка возникает, когда вы пытаетесь преобразовать столбец в кадре данных pandas из числа с плавающей запятой в целое число, но столбец содержит значения NaN.

В следующем примере показано, как исправить эту ошибку на практике.

Как воспроизвести ошибку

Предположим, мы создаем следующие Pandas DataFrame:

import pandas as pd
import numpy as np

#create DataFrame
df = pd.DataFrame({'points': [25, 12, 15, 14, 19, 23, 25, 29],
 'assists': [5, 7, 7, 9, 12, 9, 9, 4],
 'rebounds': [11, np.nan , 10, 6, 5, np.nan , 9, 12]})

#view DataFrame
df

 points assists rebounds
0 25 5 11
1 12 7 NaN
2 15 7 10
3 14 9 6
4 19 12 5
5 23 9 NaN
6 25 9 9
7 29 4 12

В настоящее время столбец «отскоки» имеет тип данных «плавающий».

#print data type of 'rebounds' column
df['rebounds']. dtype

dtype('float64')

Предположим, мы пытаемся преобразовать столбец «отскоки» из числа с плавающей запятой в целое число:

#attempt to convert 'rebounds' column from float to integer
df['rebounds'] = df['rebounds'].astype (int)

ValueError : cannot convert float NaN to integer

Мы получаем ValueError , потому что значения NaN в столбце «отскоков» не могут быть преобразованы в целые значения.

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

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

Мы можем использовать следующий код, чтобы сначала определить строки, содержащие значения NaN:

#print rows in DataFrame that contain NaN in 'rebounds' column
print(df[df['rebounds']. isnull ()])

 points assists rebounds
1 12 7 NaN
5 23 9 NaN

Затем мы можем либо удалить строки со значениями NaN, либо заменить значения NaN каким-либо другим значением перед преобразованием столбца из числа с плавающей запятой в целое число:

Метод 1: удаление строк со значениями NaN

#drop all rows with NaN values
df = df.dropna ()

#convert 'rebounds' column from float to integer
df['rebounds'] = df['rebounds'].astype (int) 

#view updated DataFrame
df
 points assists rebounds
0 25 5 11
2 15 7 10
3 14 9 6
4 19 12 5
6 25 9 9
7 29 4 12

#view class of 'rebounds' column
df['rebounds']. dtype

dtype('int64')

Способ 2: заменить значения NaN

#replace all NaN values with zeros
df['rebounds'] = df['rebounds']. fillna ( 0 )

#convert 'rebounds' column from float to integer
df['rebounds'] = df['rebounds'].astype (int) 

#view updated DataFrame
df

 points assists rebounds
0 25 5 11
1 12 7 0
2 15 7 10
3 14 9 6
4 19 12 5
5 23 9 0
6 25 9 9
7 29 4 12

#view class of 'rebounds' column
df['rebounds']. dtype

dtype('int64')

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

Дополнительные ресурсы

В следующих руководствах объясняется, как исправить другие распространенные ошибки в Python:

Как исправить: столбцы перекрываются, но суффикс не указан
Как исправить: объект «numpy.ndarray» не имеет атрибута «добавлять»
Как исправить: при использовании всех скалярных значений необходимо передать индекс

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
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
float poluperimetr(float a, float b, float c);
float radiuso(float a, float b, float c, float p);
float radiusv(float a, float b, float c, float p);
float area(float a, float b, float c, float p);
int main()
{
    setlocale(LC_ALL, "Russian");
    float p=0, R=0, r=0, S=0, a, b, c;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    p=poluperimetr(a,b,c);
    cout << "Полупериметр равен = " << p << endl;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    R=radiuso(a,b,c,p);
    cout << "Радиус описанной окружности равен = " << R << endl;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    r=radiusv(a,b,c,p);
    cout << "Радиус вписанной окружности равен = " << r << endl;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    S=area(a,b,c,p);
    cout << "Площадь равна = " << S << endl;
    system("PAUSE");
    return 0;
}
float poluperimetr(float a, float b, float c)
{
    return ((a+b+c)/2);
}
float radiuso(float a, float b, float c, float p)
{
    return ((a*b*c)/4*sqrt(p*(p-a)*(p-b)*(p-c)));
}
float radiusv (float a, float b, float c, float p)
{
    return (sqrt((p*(p-a)*(p-b)*(p-c))/p));
}
float area (float a, float b, float c, float p)
{
    return (sqrt(p*(p-a)*(p-b)*(p-c)));
}

При решении одной формулы с использованием чисел с запятой, я получаю в ответе NaN
Но при решении той же формулы с целыми числами, ответ получается адекватный

Тут все адекватно

for (double x = 1; x <= 10; x ++)
{
    double value = 2 * ((x - 1) / (x + 1)) +
                   (Math.Pow((x - 1), x) / (3 * Math.Pow((x + 1), 3)));
    Console.WriteLine("Для x = " + Math.Round(x, 2) + " Ответ: " + Math.Round(value, 2) + "n");
}

Проблема в этом коде:

for (double x = 0.1; x <= 1; x += 0.1)
{

    double value = 2 * ((x - 1) / (x + 1)) +
                   (Math.Pow((x - 1), x) / (3 * Math.Pow((x + 1), 3)));
    Console.WriteLine("Для x = " + Math.Round(x, 2) + " Ответ: " + Math.Round(value, 2) + "n");

}

Grundy's user avatar

Grundy

80.1k9 золотых знаков77 серебряных знаков133 бронзовых знака

задан 6 мая 2020 в 12:08

 loveu's user avatar

1

В случае с дробным x, в результате (x - 1) в основании степени оказывается отрицательное число. При этом показатель степени является дробным.

Для этого случая есть описание в справке

x < 0 but not NegativeInfinity; y is not an integer, NegativeInfinity, or PositiveInfinity. result = NaN

ответ дан 6 мая 2020 в 12:25

Grundy's user avatar

GrundyGrundy

80.1k9 золотых знаков77 серебряных знаков133 бронзовых знака

2

NaN возникает, когда случается попытка произвести арифметическую операцию с не числовыми данными. Когда один из аргументов например строка и никак не может быть преобразован в число.

Например вы считаете разницу: var r = a — b; Если a = 3, b = 2, то r будет 1, но если один из этих аргументов получит что-то странное, например вместо числа юзер введет скажем «вася», то в итоге получим 3 — «вася» = NaN

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

NaN в JavaScript

От автора: В данной статье мы познакомимся со специальным свойством NaN (Not-A-Number), которое является значением, представляющим не-число.

Тип числа в JavaScript содержит целые числа и числа с плавающей запятой:

const integer = 4;

const float = 1.5;

typeof integer; // => ‘number’

typeof float;   // => ‘number’

Плюс есть два специальных числовых значения: Infinity (число больше, чем любое другое число) и NaN (представляющее концепцию «не число»):

Онлайн курс по JavaScript

Научитесь создавать приложения со сложными интерфейсами

Это основной язык для современной веб-разработки — почти 100% сайтов работает на JavaScript. Освойте его с нуля всего за 4 месяца, и вы сможете зарабатывать от 70 000 рублей.

Узнать подробнее

Вас ждут 2 уровня по программированию на JavaScript

Подходит для новичков без опыта в программировании

Практика на вебинарах с разработчиками из крупных компаний

const infinite = Infinity;

const faulty = NaN;

typeof infinite; // => ‘number’

typeof faulty;   // => ‘number’

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

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

1. Число NaN

Тип числа в JavaScript — это набор всех числовых значений, включая «не число», положительную бесконечность и отрицательную бесконечность.

«Not A Number» можно получить с помощью специального выражения NaN или как свойство глобального объекта или функции Number:

typeof NaN;        // => ‘number’

typeof window.NaN; // => ‘number’

typeof Number.NaN; // => ‘number’

«Не число» — это значение, которое не представляет действительное число, несмотря на то, что оно имеет тип числа. Через NaN полезно представлять ошибочные операции с числами. Например, умножение числа на undefined не является допустимой операцией, поэтому дает NaN:

Также попытка разобрать недопустимую числовую строку, например, ‘Joker’ приводит к NaN:

parseInt(‘Joker’, 10); // => NaN

2. Проверка на равенство с NaN

Интересным свойством NaN является то, что оно не равно ни одному значению, даже самому себе:

Это поведение полезно для определения, является ли переменная NaN:

const someNumber = NaN;

if (someNumber !== someNumber) {  console.log(‘Is NaN’);

} else {

  console.log(‘Is Not NaN’);

}

// logs «Is NaN»

Выражение someNumber !== someNumber равно true, только если someNumber является NaN. Таким образом, приведенный выше фрагмент регистрирует в консоли «Is NaN». JavaScript содержит встроенные функции для определения NaN: isNaN() и Number.isNaN():

isNaN(NaN); // => true

isNaN(1);   // => false

Number.isNaN(NaN); // => true

Number.isNaN(1);   // => false

Разница между этими функциями заключается в том, что Number.isNaN() не преобразуется свой аргумент в число:

isNaN(‘Joker12’);        // => true

Number.isNaN(‘Joker12’); // => false

isNaN(‘Joker12’) преобразует аргумент ‘Joker12’ в число, которое является NaN. Таким образом, функция возвращает true.

С другой стороны, Number.isNaN(‘Joker12’) проверяет аргумент без преобразования. Функция возвращает false, потому ‘Joker12’ не равно NaN.

3. Операции, дающие NaN

3.1 Парсинг чисел

В JavaScript вы можете преобразовать числовые строки в числа. Например, вы можете легко преобразовать строку ‘1.5’ в число с плавающей запятой 1.5:

const numberString = ‘1.5’;

const number = parseFloat(numberString);

number; // => 1.5

Когда строка не может быть преобразована в число, функция синтаксического анализа возвращает NaN: указывая, что синтаксический анализ не выполнен. Вот некоторые примеры:

parseFloat(‘Joker12.5’); // => NaN

parseInt(‘Joker12’, 10); // => NaN

Number(‘Joker12’);       // => NaN

При парсинге чисел рекомендуется проверить, не является ли результат парсинга NaN:

let inputToParse = ‘Invalid10’;

let number;

number = parseInt(inputToParse, 10);

if (isNaN(number)) {  number = 0;

}

number; // => 0

Парсинг inputToParse не удался, поэтому parseInt(inputToParse, 10) возвращается NaN. Условие if (isNaN(number)) оценивается, как true, и 0 назначается number.

3.2 undefined в качестве операнда

При использовании undefined в качестве операнда в арифметических операциях, таких как сложение, умножение и т д. мы получаем NaN. Например:

function getFontSize(style) {

  return style.fontSize;

}

const fontSize = getFontSize({ size: 16 }) * 2;

const doubledFontSize = fontSize * 2;

doubledFontSize; // => NaN

getFontSize() — это функция, которая обращается к свойству fontSize из объекта стиля. При вызове getFontSize({ size: 16 }) результатом будкт undefined (свойство fontSize не существует в объекте { size: 16 }). fontSize * 2 оценивается как undefined * 2, что дает NaN.

«Not A Number» генерируется, когда в качестве значения в арифметических операциях используется отсутствующее свойство или функция, возвращающая undefined. Отсутствие undefined в арифметических операциях — это хороший способ предотвратить получение NaN.

3.3 NaN как операнд

Значение NaN также генерируется, когда операндом в арифметических операциях является NaN:

1 + NaN; // => NaN

2 * NaN; // => NaN

NaN распространяется на арифметические операции:

let invalidNumber = 1 * undefined;

let result = 1;

result += invalidNumber; // appendresult *= 2;             // duplicate

result++;                // increment

result; // => NaN

Операции с переменной result прерываются после добавления к result значения invalidNumber (которое является NaN).

3.4 Неопределенные формы

Значение NaN создается, когда арифметические операции имеют неопределенные формы. Деление 0 / 0 и Inifinity / Infinity:

0 / 0;               // => NaN

Infinity / Infinity; // => NaN

Умножение 0 и Infinity:

Сложение бесконечных чисел с разными знаками:

Infinity + Infinity; // => NaN

3.5 Неверные аргументы математических функций

Квадратный корень из отрицательного числа:

Math.pow(2, 0.5); // => NaN

(2) ** 0.5;       // => NaN

Или логарифм отрицательного числа:

4. Заключение

Понятие «не число», выраженное в JavaScript с помощью NaN, полезно для представления ошибочных операций над числами. NaN не равно ни одному значению, даже самому себе. Рекомендуемый способ проверить, содержит ли переменная NaN — использовать Number.isNaN(value).

Преобразование числовых строк в числа, в случае неудачи может дать NaN. Рекомендуется проверять, не возвращают ли parseInt(), parseFloat() или Number() NaN.

Если undefined или NaN используются в качестве операнда в арифметических операциях, это обычно приводит к NaN. Правильная обработка undefined (предоставление значений по умолчанию для отсутствующих свойств) является рекомендованным подходом для предотвращения этой ситуации.

Неопределенные формы или недопустимые аргументы для математических функций также приводят получению NaN. Но это случается редко. Вот мой практический совет: «Получили NaN? Ищите undefined!»

Автор: Dmitri Pavlutin

Источник: //dmitripavlutin.com

Онлайн курс по JavaScript

Научитесь создавать приложения со сложными интерфейсами

Это основной язык для современной веб-разработки — почти 100% сайтов работает на JavaScript. Освойте его с нуля всего за 4 месяца, и вы сможете зарабатывать от 70 000 рублей.

Узнать подробнее

Вас ждут 2 уровня по программированию на JavaScript

Подходит для новичков без опыта в программировании

Практика на вебинарах с разработчиками из крупных компаний

Редакция: Команда webformyself.

  • Ошибка распознавания файла не удалось распознать картинку
  • Ошибка распознавания тегов майнкрафт
  • Ошибка распознавания речи андроид
  • Ошибка распознавания лица бинанс
  • Ошибка распознавания tof следующий tof не найден