paulo1205
(usa Ubuntu)
Enviado em 21/06/2017 - 12:26h
Andei dando uma olhada em Fortran. No código, o que se costuma usar é a notação “(
parte_real ,
part_imag )”. Na saída, por padrão, o formato é parecido com o do C++, mas com espaços entre os parênteses e a vírgula e os números.
complex*32 z
z=(1.1q0,2.2q0)
write(*,*) z
end
Produz a seguinte saída (incluindo um espaço antes de abrir o parêntese):
( 1.10000000000000000000000000000000008 , 2.20000000000000000000000000000000015 )
Eu vi um problema com o C++: o separador entre as partes real e imaginárias é sempre uma vírgula, e isso pode dificultar o
parser e causar ambiguidades se a
locale selecionada usar vírgula como separador de casas decimais. Por exemplo: com a
locale “pt_BR”, o valor
complex<double>(1.1, 2.2) vai ser impresso como “(1,1,2,2)”, e os valores distintos
complex<double>(1, 2.3) e
complex<double>(1.2, 3) seriam ambos impressos como “(1,2,3)”.
Por um lado, é bom evitar o uso de
locales não-padrão na hora de fazer a comunicação entre programas, pois nem sempre os eventuais receptores dos dados estarão prontos para tratar locales. Na verdade, é sempre prudente usar a
locale padrão “C” quando se quer qualquer tipo deautomatização. Por outro lado, nem sempre se pode saber que a saída está ou será redirecionada para algum lugar, então como saber se se deve usar
locale ou não? Eis aí um caso de
caueat emptor (ou
caueat usor ).
Alternativamente, você poderia forçar a sempre imprimir casas decimais, mesmo quando o número for inteiro. Desse modo, seu parser poderia sempre tratar a segunda vírgula como separador entre a parte real e a parte imaginária.
#include <complex>
#include <iostream>
#include <iomanip>
#include <locale>
#include <cstdio>
using namespace std;
int main(){
setlocale(LC_ALL, "pt_BR.UTF-8");
cout << 1.5 << '\n';
cout << complex<double>(1,2) << '\n';
cout << complex<double>(1,2.3) << '\n';
cout << complex<double>(1.2,3) << '\n';
cout << complex<double>(1.2, 3.4) << '\n';
locale pt_br("pt_BR.UTF-8");
cout.imbue(pt_br);
cout << "-----\n";
cout << 1.5 << '\n';
cout << complex<double>(1,2) << '\n';
cout << complex<double>(1,2.3) << '\n';
cout << complex<double>(1.2,3) << '\n';
cout << complex<double>(1.2, 3.4) << '\n';
cout << "-----\n";
cout << setiosflags(ios::fixed) << setprecision(15);
cout << 1.5 << '\n';
cout << complex<double>(1,2) << '\n';
cout << complex<double>(1,2.3) << '\n';
cout << complex<double>(1.2,3) << '\n';
cout << complex<double>(1.2, 3.4) << '\n';
}