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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
vvt123
1 / 1 / 0
Регистрация: 13.01.2011
Сообщений: 12
#1

печать значения типа double в обычной- десятичной форме. - C++

27.02.2012, 00:43. Просмотров 1985. Ответов 10
Метки нет (Все метки)

Нужно вывести на экран значение переменной типа double .
При этом нужно, что бы при любых значениях этой переменной на экран выводилось бы значение в не экспоненциальной форме (а в обычной десятичной - 64.34232 и т.д., безо всяких "e"), при этом точность должна быть насколько хватит размерности double. Помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2012, 00:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос печать значения типа double в обычной- десятичной форме. (C++):

Ошибка вывода значения 0 типа double - C++
При выполнении этого кода при значении x=0 не выводится четкий ноль. Почему? Я так понимаю нужно проводить округление? С printf такого нет....

Побайтовый вывод значения типа double - C++
Есть решение задачи побайтового вывода значения типа double на экран. Объясните плиз каким образом это происходит. В частности функция:...

Аргумент типа double несовместим с параметром типа double* - C++
Функция function должна возвращать количество элементов массива, значение которые превышает значение средне арифметического элементов...

Аргумент типа double несовместим с параметром типа double - C++
#include <iostream> #include <cmath> #include <math.h> using namespace std; #define c 40 #define n 5 double po(double...

Написать функцию PrnStruct() с одним параметром типа TMyStruct, выводящую на печать значения полей структуры. - C++
Разработать тип данных TMyStruct– структуру, содержащую поля различных типов. В функции main() описать переменную данного типа TMyStruct,...

функция принимает два параметра типа double и возвращает значение типа double - C++
Напишите функцию, которая принимает два параметра типа double и возвращает значение типа double, содержащее их минимум....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
erro1
0 / 0 / 0
Регистрация: 14.11.2010
Сообщений: 10
27.02.2012, 00:55 #2
Экспоненциальная форма записи
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
27.02.2012, 01:01 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
# include <iostream>
# include <conio.h>
# include <iomanip.h>
using namespace std;
int main()
{
double a=2.23568955;
cout<<setprecision(12);
cout<<a;
getch();
return 0;
}
знаю что уже поздно но не в топку же)
vvt123
1 / 1 / 0
Регистрация: 13.01.2011
Сообщений: 12
27.02.2012, 01:07  [ТС] #4
В обоих случаях длинна будет отображаться столько знаков (соответственно и точность будет такая), сколько указано в setprecision, а мне нужно, что бы точность была такая, насколько хватит размерности double т.е. максимально большая. И в этом как раз проблема (т.к. double хранит значение в экспоненциальной форме). Так что вопрос не разрешён.
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
27.02.2012, 01:08 #5
если не ошибаюсь то
C++
1
cout<<setprecision(N);
N максимальное значение может принять 40 больше знаков у меня не выводило) так сделай константой) и поставь 40
а double больше 40 не потянет
vvt123
1 / 1 / 0
Регистрация: 13.01.2011
Сообщений: 12
27.02.2012, 01:18  [ТС] #6
A555,
erro1,
В обоих случаях длинна будет отображаться столько знаков (соответственно и точность будет такая), сколько указано в setprecision, а мне нужно, что бы точность была такая, насколько хватит размерности double т.е. максимально большая. И в этом как раз проблема (т.к. double хранит значение в экспоненциальной форме). Так что вопрос не разрешён.

Добавлено через 9 минут
A555, double может хранить гораздо больше 40 знаков но, только для тех чисел у которых мантиса не привысит размерность отведённую для мантисы(всё дело в том, что они там хранятся в экспонициальной форме) т.е.
чилсо double d=0.0000000000000000000000000000000000000000000005 , нормально уместится в double и будет хранится, как 0.5*10 в -50 степени, а вот у d=0.123456789123456789, последняя 9 уже не поместится в мантису и всегда будет выводится только 0.12345678912345678
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
27.02.2012, 01:21 #7
хмм) незнал тогда как вариант написать небольшой алгоритм и засунуть всё числа с цифрами после запятой в массив
vvt123
1 / 1 / 0
Регистрация: 13.01.2011
Сообщений: 12
27.02.2012, 01:48  [ТС] #8
A555, + ещё возникают всякие нюансы связанные с переводом дробей из двоичных числе и обратно. Я толком даже в этих нюансах пока так и не разобрался, но вот пример демонструрующий проблему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[]){
 double d;
        d=(0.1+0.7)*10;
        cout.setf(ios_base::fixed);
        cout<<d<<endl;//нормальный резульатат
        cout.precision(17);
        cout << endl << d; // прикол:)
        cin.get();
        cin.get();
    return 0;
}
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
27.02.2012, 02:01 #9
да интересная ситуация ) может машина считает по Гейне) что у каждой точки есть окрестность и он берет не 0,1 а 0,0(9)

Добавлено через 4 минуты
и ещё что интересно
C++
1
2
3
  d=(0.6+0.1)*10;
  d=(0.8+0.1)*10;
  d=(0.5+0.1)*10;
так всё нормально) а только тот случай что ты написал
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
27.02.2012, 03:47 #10
Максимальное значение для double 1,8e308, причем значащих разрядов всего 16, остальные разряды заполняются нулями. Какой смысл выводить полэкрана нулей, непонятно.

Цитата Сообщение от vvt123 Посмотреть сообщение
A555, + ещё возникают всякие нюансы связанные с переводом дробей из двоичных числе и обратно. Я толком даже в этих нюансах пока так и не разобрался, но вот пример демонструрующий проблему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[]){
 double d;
        d=(0.1+0.7)*10;
        cout.setf(ios_base::fixed);
        cout<<d<<endl;//нормальный резульатат
        cout.precision(17);
        cout << endl << d; // прикол:)
        cin.get();
        cin.get();
    return 0;
}
Нюанс заключается в том, что не всякая десятичная дробь может быть представлена конечным числом двоичных разрядов.
A555
51 / 51 / 2
Регистрация: 04.04.2011
Сообщений: 209
27.02.2012, 03:50 #11
вот новая информация и твой пример при выводе 16 знаков работает верно а если уже надо больше то закидывай своё число в массив
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2012, 03:50
Привет! Вот еще темы с ответами:

Запись информации из вектора типа string в вектор типа double - C++
Как записать только числа , которые хранятся в векторе типа стринг, в вектор типа дабл, в векторе типа стринг есть как буквы так и числа ,...

В массив типа double записываю целые числа (типа int), но ошибка не вылазиет! - C++
Вот программулька: #include &lt;iostream&gt; using namespace std; #include &lt;conio.h&gt; int main() { double arr={1,2,3,4,5}; ...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.02.2012, 03:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru