Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 20:28   #1
SrgGld
Пользователь
 
Аватар для SrgGld
 
Регистрация: 23.10.2010
Сообщений: 17
Вопрос Перевод Double в строку *char

Как получить из переменной типа Double массив char'ов (в MS VC++)?
Нашёл следующее:
Код:
string TypeToStr(const double &rhs)
{
        stringstream ss;
        ss << rhs;
        return ss.str();
}
То есть можно потом преобразовать string в массив char. Выглядит иррационально.
Ещё вариант:
Код:
char buff [100];
double val = 1.234;
sprintf (buff, "%f", val);
"cout << buff";
Тут есть опасения выхода за пределы буфера.
Или функции:
char* _ecvt(double value, int count, int* dec, int* sign);
char* _fcvt(double value, int count, int* dec, int* sign);
char* _gcvt(double value, int digits, char* buffer);
тут либо точность задавать жёстко либо буфер опять, да и вообще не очень понятно.
Так нет ли способа получить на выходе из функции *char, чтоб он указывал на массив содержащий просто все цифры числа и точку, отделяющую дробную часть?
SrgGld вне форума Ответить с цитированием
Старый 16.04.2011, 20:57   #2
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Функция ftoa().
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 16.04.2011, 21:19   #3
SrgGld
Пользователь
 
Аватар для SrgGld
 
Регистрация: 23.10.2010
Сообщений: 17
Вопрос

Для ftoa(): общее число цифр в сформированной строке, включая целую, дробную части и разделительную точку - не больше 7.
А мне надо всё, что есть по-максимуму, чтоб не терять имеющуюся точность.
Может можно как-то написать самому такую функцию, да только алгоритм не могу осознать.
Можно выделить целую часть в интеджер. Интеджер в строку переводится элементарно. Дописать точку. Вычесть из исходного числа целую часть, и потом, умножая на десять, получать разряды. Но когда в таком случае остановиться?
SrgGld вне форума Ответить с цитированием
Старый 16.04.2011, 21:54   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Интеджер в строку переводится элементарно. Дописать точку. Вычесть из исходного числа целую часть, и потом, умножая на десять, получать разряды.
ну вот так и делай)
остановиться можно на определенном количестве цифр после запятой или вывести как период, например (как это сделать поищи на форуме, были уже темы)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.04.2011, 22:05   #5
SrgGld
Пользователь
 
Аватар для SrgGld
 
Регистрация: 23.10.2010
Сообщений: 17
Вопрос

То есть в double нет конкретного определённого числа верных разрядов после запятой?
SrgGld вне форума Ответить с цитированием
Старый 16.04.2011, 22:08   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

они на то и числа с плавающей запятой.
там есть погрешности.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.04.2011, 22:11   #7
SrgGld
Пользователь
 
Аватар для SrgGld
 
Регистрация: 23.10.2010
Сообщений: 17
По умолчанию

Ок. Попробую так. Всем спасибо за советы и ответы.
SrgGld вне форума Ответить с цитированием
Старый 17.04.2011, 10:46   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
То есть в double нет конкретного определённого числа верных разрядов после запятой?
скорее всего есть, но только двоичных разрядов)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 17.04.2011, 12:59   #9
SrgGld
Пользователь
 
Аватар для SrgGld
 
Регистрация: 23.10.2010
Сообщений: 17
По умолчанию

Для двоичных-то точно есть предел, поэтому я и предполагал наличие способа определить максимальный разряд после запятой, который был бы определён верно.
Вот что примерно получилось (для отладки оформил отдельным проектом):

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	double n=0;
	unsigned int accuracy=0; //количество цифр после запятой
	cin>>accuracy;
	cin>>n;
	int x=n;
	bool minus=n<0; //знак будет использоваться отдельно
	int c=0; //длина целой части
	while (x) {
		x/=10;
		c++;
	}
	x=n;
	n-=x;
	unsigned int len=c+1+accuracy; //длина всего выводимого числа с точкой
	char *s=new char [len+1];
	s[c]='.';
	s[len]=0;
	int c1=c+1;
	while (x) { //вывод целой части
		s[--c]=x%10+'0';
		x/=10;
	}
	for (int i=0; i<accuracy; i++) { //вывод дробной части
		n*=10;
		x=n;
		s[c1+i]=x+'0';
		n-=x;
	}
	cout<<s;
	return 0;
}
Работает, разумеется, при корректном вводе данных.

Последний раз редактировалось SrgGld; 17.04.2011 в 14:45.
SrgGld вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод в string из unsigned char Dimarik Общие вопросы C/C++ 5 22.03.2011 22:46
Перевод char во float в С. vitalyisaev2 Помощь студентам 1 07.05.2010 19:13
Перевод String в Double mauseO Помощь студентам 2 29.01.2010 15:29
Перевод десятичных чисел в тип Double Kuzya59 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 04.12.2008 15:41
перевод из int в массив char. Freeman Общие вопросы C/C++ 5 30.05.2008 17:49