Проблема с математическими формулами

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Artem Rytuhin
254
Artem Rytuhin  

Приветствую всех.

Столкнулся с проблемой.

Написал вот такой код

double pp=2.5;
double pp2=5/2;


Print (pp+" "+pp2);

Получил в итоге  2.5  и 2  

Произошло срезание до точки. Не могу записать в переменную вычисление формулы. Началось все с того что я записывал в переменную такую формулу double pp=(X/100)*Y;

Где X=10, а Y=80, в итоге при выводе результата получаю 0.

В чем может быть дело ?

Aleksey Semenov
3635
Aleksey Semenov  
дело в типе данных как уже много раз писали 5/2 или 5.0/2.0 есть разница
Vitalii Ananev
10660
Vitalii Ananev  
Artem Rytuhin:

Приветствую всех.

Столкнулся с проблемой.

Написал вот такой код

double pp=2.5;
double pp2=5/2;


Print (pp+" "+pp2);

Получил в итоге  2.5  и 2  

Произошло срезание до точки. Не могу записать в переменную вычисление формулы. Началось все с того что я записывал в переменную такую формулу double pp=(X/100)*Y;

Где X=10, а Y=80, в итоге при выводе результата получаю 0.

В чем может быть дело ?

Тут происходит неявное преобразование типов, так как компилятор считает 5 и 2 целым типом и после деления преобразует результат в целое. По этому если напишите вот так: double pp2=5.0/2.0;  , то все будет нормально.

Alexey Volchanskiy
27274
Alexey Volchanskiy  
Vitalii Ananev:

Тут происходит неявное преобразование типов, так как компилятор считает 5 и 2 целым типом и после деления преобразует результат в целое. По этому если напишите вот так: double pp2=5.0/2.0;  , то все будет нормально.

Даже одного числа в double будет достаточно, так как в операциях умножения и деления второе автоматом приведется к double

Ну это так, мелочное уточнение ))

А вообще, деление медленная операция, лучше вот так

double pp2=5.0 * 0.5
Dmitriy Skub
12049
Dmitriy Skub  
Интересно, сколько уже таких вопросов было задано за последние лет 10?))
Alexander Ivanov
17185
Alexander Ivanov  

Привет!


Параметры можно задать в начале, тогда будет как надо)).

double A=5; 

double S=2;  

double pp=2.5;

double pp2=A/S;

Print (pp+" "+pp2);


Nikolay Demko
14102
Nikolay Demko  
Artem Rytuhin:

Приветствую всех.

Столкнулся с проблемой.

Написал вот такой код

double pp=2.5;
double pp2=5/2;


Print (pp+" "+pp2);

Получил в итоге  2.5  и 2  

Произошло срезание до точки. Не могу записать в переменную вычисление формулы. Началось все с того что я записывал в переменную такую формулу double pp=(X/100)*Y;

Где X=10, а Y=80, в итоге при выводе результата получаю 0.

В чем может быть дело ?

С формулами проблем нет, есть проблемы с непониманием типов, это уже ответили выше.

В вашей формуле достаточно было поставить маленькую точку и всё будет работать.

У вас вот тут  --> double pp=(X/100)*Y; есть 3 ячейки памяти X 100 и Y, при этом если хоть одна из них будет double, то при операции с ней всё остальное тоже будет double (это автоматическое приведение типов).

Но видимо ни одна из ячеек у вас не double, раз результат 0. Ведь если X Y объявлены как int, а 100 в данном контексте компилятором читается тоже как int, то 10/100=0 а 0*80=0. Так что машинка всё верно посчитала.

Но вот если в формуле поставить после 100 точку, результат будет другим:

double pp=(X/100.)*Y;  проверьте, даже если X Y объявлены как int, формула посчитает то что вам нужно.

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

вот так double k=100; прокатит. А вот так double k=x*100; может не прокатить если x int.

Yuriy Asaulenko
9360
Yuriy Asaulenko  
Nikolay Demko:

1. double pp=(X/100.)*Y;  проверьте, даже если X Y объявлены как int, формула посчитает то что вам нужно.

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

2. вот так double k=100; прокатит. А вот так double k=x*100; может не прокатить если x int.

П.2 противоречит п.1. П.1 при целом Х скорее не прокатит.

Ну, это я так, чтобы разговор поддержать.)

Nikolay Demko
14102
Nikolay Demko  
Yuriy Asaulenko:

П.2 противоречит п.1. П.1 при целом Х скорее не прокатит.

Ну, это я так, чтобы разговор поддержать.)

))

Прокатит уверяю вас. Первым действием будет X/100.

перед исполнением компилятор приведёт X к типу double, чтоб оба операнда были одного типа.

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

Кто не верит проверка займёт 13 секунд.

Открыл ME, сгенерил скрипт, написал Print(pp); сверху прикопипастил синию формулу. F7, и запуск в МТ. Результат налице )))

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

Если в double k=100; оно единственное.

То в k=x*100; перед присвоением ещё есть действия, результат непременно при присвоении в переменную k будет приведён, но нам то нужно чтоб он был приведёт ещё на стадии расчётов.

Yuriy Asaulenko
9360
Yuriy Asaulenko  
Nikolay Demko:

))

Прокатит уверяю вас. Первым действием будет X/100.

перед исполнением компилятор приведёт X к типу double, чтоб оба операнда были одного типа.

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

Кто не верит проверка займёт 13 секунд.

Открыл ME, сгенерил скрипт, написал Print(pp); сверху прикопипастил синию формулу. F7, и запуск в МТ. Результат налице )))

От компилятора зависит. В большинстве тип определяется по первому операнду, т.е., по Х. Т.е., (double)X, и все проблемы для Х/100 или Х*100 решены.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий