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

Преобразовать string в complex - C++

Восстановить пароль Регистрация
 
 
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
28.07.2015, 10:07     Преобразовать string в complex #1
Добрый день!

Вот такая простая задачка имеется.
C++
1
2
string S="(1.00000 -2.12363e-09)";
complex cnum;
Требуется избавиться от скобок, а числа поместить в cnum соответственно.

Как бы это поэлегантнее сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2015, 10:07     Преобразовать string в complex
Посмотрите здесь:

C++ преобразовать double в string
Как преобразовать char в string C++
Преобразовать string в float C++
C++ Преобразовать int в string
C++ Преобразовать string в int .?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
29.07.2015, 13:51     Преобразовать string в complex #21
Цитата Сообщение от rotciv Посмотреть сообщение
Число 1.797693134862316e+308 близко к максимальной возможности формата double.
Можно попробовать использовать std::complex<> вместе с MPIR,MPFR

Добавлено через 54 секунды
Цитата Сообщение от rotciv Посмотреть сообщение
Давайте попробуем. Но мне для начала надо разобраться с опцией С++11 (похоже, в моем компиляторе это опция -std=c++0x).
Я вроде как указал какая опция вам нужна.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
29.07.2015, 16:49  [ТС]     Преобразовать string в complex #22
В общем, я к такому решению в результате пришел.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
         
          string temp, x, x2;  // x, x2 содержат real и imag части комплексного числа
          stringstream ss;
          double real, imag;
...
          temp=x+", "+x2;
          SS_RESET
          ss<<temp;
          if(!(ss>>cx)) {
            real=atof(x.c_str());
            if(real>1.7e+308) cx.real(1.7e+308);
            imag=atof(x2.c_str());
            if(imag>1.7e+308) cx.imag(1.7e+308);
          };
На первый взгляд, делает то, что надо.

Avazart, Mr.X, спасибо за помощь!

Добавлено через 5 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Я вроде как указал какая опция вам нужна.
Не принимает эту опцию.
cc1plus: error: unrecognized command line option "-std=c++11"
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
29.07.2015, 17:32     Преобразовать string в complex #23
Тогда стоит произвести обновление.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,686
29.07.2015, 18:42     Преобразовать string в complex #24
Вот так нормально работает:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <complex>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_str;
typedef std::complex< double    >   T_complex;
/////////////////////////////////////////////////////////////////////////////////////////
T_complex   str_to_compl( T_str     const   &   s )
{
    static  const   double  EMPTY_VAL     =   1e+308;
 
    T_complex   c   (
                        EMPTY_VAL,
                        EMPTY_VAL
                    );
 
    auto        ind     =   s.find('(');
 
    std::istringstream  ssin
        (
            s.substr( ind + 1 )
        );
 
    T_str   real_str;
    ssin    >>  real_str;
    try
    {
        c.real  (
                    stod( real_str )
                );
    }
    catch(...)
    {}
 
    T_str   imag_str;
    ssin    >>  imag_str;
    try
    {
        c.imag  (
                    stod( imag_str )
                );
    }
    catch(...)
    {}
 
    return  c;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  "compl_str = ";
 
        T_str   s;
        getline( std::cin, s );
 
        std::cout   <<  str_to_compl(s)
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }//for
}
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
31.07.2015, 11:22  [ТС]     Преобразовать string в complex #25
Спасибо.

Касательно большого числа - похоже, это значение float и double интерпретируется как NAN (Not a Number).
В этом смысле, присвоение меньшего значения (1.7е+308) не совсем правильно. Потому что величина становится Number, хоть и очень большой.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
31.07.2015, 11:24     Преобразовать string в complex #26
Цитата Сообщение от rotciv Посмотреть сообщение
не совсем правильно.
Не правильно выходить за пределы размера типа.
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
31.07.2015, 11:28  [ТС]     Преобразовать string в complex #27
Думаю, в этом случае следует сделать обход обработки числа, поскольку преобразовывать NaN в комплексное не имеет никакого смысла.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,686
31.07.2015, 12:22     Преобразовать string в complex #28
Цитата Сообщение от rotciv Посмотреть сообщение
похоже, это значение float и double интерпретируется как NAN (Not a Number).
Что-то вы меня совсем запутали. NAN так и выводится NAN. Вы же приводили только одно число, которое не обрабатывалось – double max. Откуда флоаты и наны взялись?
Похоже, мы с вами умудрились решить задачу так и не узнав ее точной формулировки. Если руководствоваться моей подписью, то это настоящее проектирование и есть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 16:56     Преобразовать string в complex
Еще ссылки по теме:

Преобразовать string^ в double C++
C++ Преобразовать string в wchar_t
Преобразовать string в TCHAR C++

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

Или воспользуйтесь поиском по форуму:
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
31.07.2015, 16:56  [ТС]     Преобразовать string в complex #29
Формулировка общей задачи - не секрет, но я затрудняюсь это изложить в сжатой форме.

Программа, которую я пишу, должна читать данные, записанные программой Cadence Spectre в формате psfascii.
Иногда среди данных встречаются NaNы.
Spectre написан на C/C++, но почему-то в формате psfascii NaN не выводится как NaN, а в виде как я писал выше.
Возможно, причина - в том, что эта часть кода написана давно (возможно, после 90-х ее вообще не трогали, и это - точно С, а не С++).

Когда я просматриваю данные с помощью других программ, входящих в пакет, вижу NaN.

Есть мысль указать спецификацию формата "%20.16g", возможно тогда округлений удастся избежать, и проблема уйдет сама собой.

Добавлено через 3 часа 54 минуты
Цитата Сообщение от rotciv Посмотреть сообщение
Есть мысль указать спецификацию формата "%20.16g",
Даже "%24.17g". Это помогло, проблема ушла.
Yandex
Объявления
31.07.2015, 16:56     Преобразовать string в complex
Ответ Создать тему
Опции темы

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