Форум программистов, компьютерный форум CyberForum.ru

неожиданный результат - C++

Восстановить пароль Регистрация
 
snap492
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 3
02.03.2014, 00:37     неожиданный результат #1
не могу понять в чем проблема приложение рассчитывает по первым 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
//программа по расчету вводимых значений согласно условию вводу
#include <iostream>
#include <math.h>
using namespace std;
int main()
    {
    int i0, i;
    double i1,a,e,fobs;
    cout << "Введите i: ";
    cin>>i;
    cout << "Введите a: ";
    cin>>a;
    i0=i%2   ;
        if (i0 == 0 && a>0)  //тут все считается правильно согласно условия остаток равен нулю и а больше нуля
            {  
             e= i*sqrt(a);
             cout <<e<<endl;
            }
        else            
            if (i0 != 0 && a<0) // тут тоже все считает правильно остаток не равен нулю и а меньше нуля
                {
                fobs = fabs(a);
                e=(i/2)*sqrt(fobs)  ;
                cout <<e<<endl;
                }             
            
            else // а вот тут считает хрен знает как
                {
                i1=static_cast <double> (i);
                fobs = fabs(i1) * fabs(a);
                e=sqrt(fobs);
                cout <<e<<endl;
                }           
            system("pause");
            return 0;
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2014, 00:37     неожиданный результат
Посмотрите здесь:

Невозможный результат C++
C++ Предугадать результат
Не выводится результат C++
Не выводит результат C++
C++ Неправильный результат
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
02.03.2014, 00:54     неожиданный результат #2
Цитата Сообщение от snap492 Посмотреть сообщение
вот тут считает хрен знает как
Поподробнее можно? Со значениями переменных желательно.

Добавлено через 54 секунды
Цитата Сообщение от snap492 Посмотреть сообщение
C++
1
i1=static_cast <double> (i);
Это я бы заменил на это:
C++
1
i1=i*1.0;
Сие хоть понятно как себя поведет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.03.2014, 00:56     неожиданный результат #3
int в double неявно преобразуется без потери данных. поэтому явные касты и прочие хитрости - лишнее.
snap492
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 3
02.03.2014, 02:26  [ТС]     неожиданный результат #4
Цитата Сообщение от snap492 Посмотреть сообщение
вот тут считает хрен знает как
Поподробнее можно? Со значениями переменных желательно.

Добавлено через 54 секунды
Цитата Сообщение от snap492 Посмотреть сообщение
Код C++
1
i1=static_cast <double> (i);
Это я бы заменил на это:
Код C++
1
i1=i*1.0;
Сие хоть понятно как себя поведет.
пример берем не четное 9 так как оно легко выводится в целое из под корня и берем положительное число 4 данные переменные несоответствуют значениям if следовательно должно считаться по второму else в ответе мы должны получить 6 а программа выдает ответ 8
а насчет явного преобразования типов вроде тоже все понятно
int в double неявно преобразуется без потери данных. поэтому явные касты и прочие хитрости - лишнее.
согласен но MS Visual C++ 2008 с использованием math.h ругается что с функцией fabs (i) не ясно какой тип float, double, long double.

Добавлено через 25 минут
хз что произошло но как то рассосалось само по себе теперь решает верно может был глюк компилятора какой то
всем спс
модераторы прошу закрыть тему
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.03.2014, 02:32     неожиданный результат #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
fabs(i) - тут да. неоднозначность.
double i1=static_cast <double> (i); // тут явное преобразование лишнее. можно без него:
double i1=i;
ну и если вы i1 завели только для разрешения этой неоднозначности, то лучше ее разрешать
в точке вызова этой функции, где явный каст вполне уместен:
fabs(static_cast<double>(i)); // не нужны посредники вроде i1;
Yandex
Объявления
02.03.2014, 02:32     неожиданный результат
Ответ Создать тему
Опции темы

Текущее время: 03:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru