В чем ошибка в программе вычисления выражений? Вместо результата выводит nan

203
21 декабря 2018, 03:30

Нужно сделать программу, которая выводит результат вычисления выражения в консоль. Проблема в том, что результат выводится корректно, если присвоить значения переменным в коде программы. Но если ввести их с клавиатуры, то выводит 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("Входные данные \r\n");
        System.out.print("============== \r\n");
        System.out.printf("a =%.1f",a);
        System.out.print( "\r\n");
        System.out.printf("d = %d ",d);
        System.out.print( "\r\n");
        System.out.printf("x = %d",x);
        System.out.print( "\r\n");
        System.out.printf("U=%f",m);
        System.out.print("\r\n");
        System.out.print("Результат:\r\n");
        System.out.print("==============");
        System.out.print( "\r\n");
        System.out.printf("B= %f",res);
    }
}
Answer 1

В документации Math.acos написано:

If the argument is NaN or its absolute value is greater than 1, then the result is NaN.

В вашем случае, Вы пытаетесь вычислить арккосинус числа, которое больше единицы и получаете в ответе NaN

Если присвоить значения переменным в коде программы, тоже будет выводиться NaN, попробуйте вместо определения переменных через nextInt(), определить их в коде программы так:

int x = 22;
int d = 7;
double a = 1.4;
double m = 14.9;
READ ALSO
Преобразование типа фрагмента

Преобразование типа фрагмента

имеется следующий вопросУчу андроид программирование по книге, и там встретил следующий код:

206
Hibernate — почему не работает кэш первого уровня?

Hibernate — почему не работает кэш первого уровня?

Из статьи на хабре: Кеш первого уровня всегда привязан к объекту сессииHibernate всегда по умолчанию использует этот кеш и его нельзя отключить

195
Как не выгружать из памяти неактивные Fragment?

Как не выгружать из памяти неактивные Fragment?

Часть из MainActivity для загрузки Fragment's:

213