3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
1

Тип выводимых данных. abs() и fabs()

21.12.2014, 23:29. Показов 3803. Ответов 12
Метки нет (Все метки)

Здравствуйте, столкнулся с такой проблей при выводе через cout данных типа double выводится почемуто только 2 знака после запятой(хотя их там 16 значащих цифр), если не сделать принудительное приведение к типу double в cout, если сделать приведение то всё нормально
Кроме того если использовать setprecision() то всё выводится нормально без приведения типа (правда выводит кроме значащих цифр ещё и ненужные нули)
Может кто подсказать почему так? раньше с таким ни разу не встречался, всё всегда с выводом было в порядке
Другой проект работает нормально всё выводится как и должно

вот объявление данных и вывод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double u[n1+1][n+1][n+1][n+1];// хранит значение функции u на всех временных слоях
double x[N],y[N], z[N], t[N];
 
...
 
cout<<"x\ty\tz\tt\tUn\tU\t|Un-U|\n";
out<<"x\ty\tz\tt\tUn\tU\t|Un-U|\n";
    for(s=1;s<n1;s++) // вычисляем максимальную погрешность решения на каждом временном слое на текущей итерации
        for(k=1;k<n;k++)
        {
            double k1;
            k1=abs((double)u[s][k][n/2][n/2]-(double)toch_resh(x[n/2], y[n/2], z[k], t[s]));
            cout<<x[n/2]<<'\t'<<y[n/2]<<'\t'<<z[k]<<'\t'<<t[s]<<'\t'<<u[s][k][n/2][n/2]<<'\t'<<toch_resh(x[n/2], y[n/2], z[k], t[s])<<'\t'<<k1<<endl;
            out<<x[n/2]<<'\t'<<y[n/2]<<'\t'<<z[k]<<'\t'<<t[s]<<'\t'<<u[s][k][n/2][n/2]<<'\t'<<toch_resh(x[n/2], y[n/2], z[k], t[s])<<'\t'<<k1<<endl;
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2014, 23:29
Ответы с готовыми решениями:

Тип FILE, abs. не определен идентификатор
Просмотрите, пожалуйста, функции в целом 1.В процедуре вывода не определен идентификатор j...

Даны натуральное число n, действительные числа а1,…,аn.вычислить abs(a1)+…+abs(an)
даны натуральное число n, действительные числа а1,…,аn.вычислить abs(a1)+…+abs(an) (a1 и an по...

Группировка выводимых данных
Добрый день. Есть база данных с таблицей, вот такого вида: Хочу собрать статистику согласных и...

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

12
7345 / 6271 / 2852
Регистрация: 14.04.2014
Сообщений: 27,158
22.12.2014, 09:18 2
Что именно из всего этого выводится не так и какое там значение?
0
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
22.12.2014, 15:15  [ТС] 3
вот эта строка выводит у предпоследних 2-x чисел (на 2-й строке нижеприложенного кода находятся, с них она начинает) всего по 2 знака после запятой, хотя они все типа double и отличаются в 15-16 знаке после запятой, а последнее значение выводит 0 хотя должно быть число в -15,-16 степени
C++
1
2
3
cout<<x[n/2]<<'\t'<<y[n/2]<<'\t'<<z[k]<<'\t'<<t[s]<<'\t'
<<u[s][k][n/2][n/2]<<'\t'<<toch_resh(x[n/2], y[n/2], z[k], t[s])<<'\t'
<<abs(u[s][k][n/2][n/2]-toch_resh(x[n/2], y[n/2], z[k], t[s]))<<endl;

C++
1
2
   x    y   z   t   Un  U     |Un-U|
          0.5   0.5 0.1 0.2 1.71    1.71        0
0
7345 / 6271 / 2852
Регистрация: 14.04.2014
Сообщений: 27,158
22.12.2014, 16:03 4
По умолчанию вся цифры и не выводятся. Указывай явно, сколько тебе нужно после запятой. Для последнего используй научный формат с E.
0
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
22.12.2014, 20:20  [ТС] 5
вот кусок кода из другого проекта, всё выводит нормально
C++
1
2
3
4
double t,t1=0,ft,ft4;
t=(usl_x[j]*2-b-a)/(b-a);
ft4=raslojg(t,1);
cout<<usl_x[j]<<"\t"<<f(usl_x[j])<<"\t"<<ft4<<"\t"<<abs(f(usl_x[j])-ft4)<<endl;
C++
1
0.0975  3.195   3.195   9.28146e-014
меня собственно волнует только последний столбец, потому как 0 там не может быть

т.е. при
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 double u[n1+1][n+1][n+1][n+1];// хранит значение функции u на всех временных слоях
double x[N],y[N], z[N], t[N];
 
...
 
cout<<"x\ty\tz\tt\tUn\tU\t|Un-U|\n";
out<<"x\ty\tz\tt\tUn\tU\t|Un-U|\n";
    for(s=1;s<n1;s++) // вычисляем максимальную погрешность решения на каждом временном слое на текущей итерации
        for(k=1;k<n;k++)
        {
            cout<<x[n/2]<<'\t'<<y[n/2]<<'\t'<<z[k]<<'\t'<<t[s]<<'\t'
              <<u[s][k][n/2][n/2]<<'\t'<<toch_resh(x[n/2], y[n/2], z[k], t[s])<<'\t'
              <<abs(u[s][k][n/2][n/2]-toch_resh(x[n/2], y[n/2], z[k], t[s]))<<endl;
       }
выведет
C++
1
2
 x      y     z     t      Un       U     |Un-U|
 0.5   0.5   0.1  0.2   1.71    1.71        0
а при
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double u[n1+1][n+1][n+1][n+1];// хранит значение функции u на всех временных слоях
double x[N],y[N], z[N], t[N];
 
...
 
cout<<"x\ty\tz\tt\tUn\tU\t|Un-U|\n";
out<<"x\ty\tz\tt\tUn\tU\t|Un-U|\n";
    for(s=1;s<n1;s++) // вычисляем максимальную погрешность решения на каждом временном слое на текущей итерации
        for(k=1;k<n;k++)
        {
            double k1;
            k1=abs((double)u[s][k][n/2][n/2]-(double)toch_resh(x[n/2], y[n/2], z[k], t[s]));
            cout<<x[n/2]<<'\t'<<y[n/2]<<'\t'<<z[k]<<'\t'<<t[s]<<'\t'<<u[s][k][n/2][n/2]<<'\t'<<toch_resh(x[n/2],             
             y[n/2],  z[k], t[s])<<'\t'<<k1<<endl;
        }
выведет
C++
1
2
 x      y     z     t      Un       U            |Un-U|
 0.5   0.5   0.1  0.2   1.71    1.71        4.44089e-016
вот мне и интересно почему во втором случае делаю принудительное приведение, переменных которые и так типа double
ведь насколько я понимаю вот такая програмка выдаст true, в моём же коде почемуто это не выполняется
C++
1
2
3
4
double s=1,s1;
s1=s;
s=(double)s;
if(s==s1) cout<<"true";
, почему в 2-м случае всё работает правильно а в 1-м (без приведения) не работает? в других проектах всё нормально, проект создавался с нуля, в свойствах ничего не ковырял
0
7345 / 6271 / 2852
Регистрация: 14.04.2014
Сообщений: 27,158
22.12.2014, 21:51 6
А toch_resh() какой тип возвращает?
0
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
23.12.2014, 14:55  [ТС] 7
C++
1
2
3
4
double toch_resh(double x, double y, double z, double t)// находит точное решение 
{
    return x*x+y*y+z*z+6*t;
}
0
7345 / 6271 / 2852
Регистрация: 14.04.2014
Сообщений: 27,158
23.12.2014, 18:06 8
Дело в abs(), есть 2 разновидности. Та, которая в cstdlib, возвращает целое. Используй fabs().
0
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
23.12.2014, 21:24  [ТС] 9
не использую cstdlib, подключаю только
C++
1
2
3
#include <iostream>
#include <fstream>
# include <cmath>
в другой лабораторной вот такой код работает правильно (все переменные и функции типа double)
C++
1
2
3
4
5
6
        x_temp=x[i][0]+h*koef[j];
        s1=f(x_temp);
        s2=lagrange_spline(x_temp,i);
        s3=lagrange_interp(x_temp);
        k=abs(s1-s2);
        cout<<x_temp<<"\t"<<s1<<"\t"<<s2<<"\t"<<k<<"\t"<<abs(s3-s1)<<endl;
выводит
C++
1
0.1925  1.01235        1.01235   4.44089e-016       8.88178e-016
Добавлено через 8 минут
и как на тип возвращаемого функцией значения влияют используемы в функции переменные
по вашему ответу получается что abs имеет тип int, если в качестве переменной используется переменная типа double
C++
1
 abs(u[s][k][n/2][n/2]-toch_resh(x[n/2], y[n/2], z[k], t[s]))
то приведёт к int, а вот если используется приведение типа к переменной функции
C++
1
abs((double)u[s][k][n/2][n/2]-(double)toch_resh(x[n/2], y[n/2], z[k], t[s]));
abs то результатом функции abs будет double?
это вообще возможно? (о перегрузке функций я знаю но тут никая перегрузка не поможет не может существовать 2 функций с одинаковым списком параметров, ведь
C++
1
(double)[(double)k]=[(double)k)]
0
7345 / 6271 / 2852
Регистрация: 14.04.2014
Сообщений: 27,158
23.12.2014, 22:18 10
Лучший ответ Сообщение было отмечено daert как решение

Решение

iostream, например, может подключать, даже если ты не указал это явно.
Я предположил, что дело в abs(), потому что результат явно целый получается, берётся целая часть. Замени на fabs() и посмотри, что будет.
1
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
23.12.2014, 22:39  [ТС] 11
хммм всё заработало, и без привидения типов, но как ни странно ничего не менял в коде кроме того что удалил привидение к типу double, может просто из-за того что комп долго не перезагружал(порядка двух недель) такая ошибка и появилась
0
7345 / 6271 / 2852
Регистрация: 14.04.2014
Сообщений: 27,158
23.12.2014, 23:02 12
fabs() проверил?
Перезагрузка тут не причём.
0
3 / 2 / 3
Регистрация: 09.05.2014
Сообщений: 60
24.12.2014, 02:32  [ТС] 13
всё заработало с abs
перезагрузка может и помочь, в прошлый раз когда у меня отказывалось выводить значения переменных в программе помогла, я виндумз уже 3 с лишним года не переустанавливал, да и мусора сейчас в нём много
fabs работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2014, 02:32
Помогаю со студенческими работами здесь

Сортировка выводимых из БД данных
Делаю вывод последних 20 записей из mysql. Дело в том что самая последняя запись которая вносилась...

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

Нумерация данных, выводимых из БД
Кароче парни такое дело. Есть вью в котором выводяться данные бызы. Как правильно сделать нумерацию...

Нет перегруженной подпрограммы с такими типами параметров f:=(FUNC)-abs(FUNC) перед abs
Program lb4n5; Var x,b,y:real; Function FUNC(x,b:real):real; Begin ...

Нарисовать на плоскости (x,y) область, в которой и только в которой истинно логическое выражение abs(x)>abs(y)
Народ, нарисовать на плоскости (x,y) область, в которой и только в которой истинно логическое...

std::abs vs global abs
Откуда растут ноги такого поведения, что std::abs возвращает double, а глобальная ::abs() - int ?...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru