xtrm0 Posted March 2, 2012 Report Share Posted March 2, 2012 Boas. Estou a tentar fazer uma exponenciacao a um numero complexo de um numero inteiro em c++ e preciso de saber a parte inteira do numero, mas com um certo numero de casas décimais(10). Estou a usar sempre o tipo long double, no entanto quando chamo a função pow/cos/log, devolve-me sempre um float. Como é que posso forçar o programa a chamar a funcao long double pow(long double a,long double b)? int main(){ long double a=2.0000000000001, x=1.00000000001, y=1.00000000001, tmp; tmp = (pow(long double(a),long double(x))* cos(long double(y)*long double(log(long double(a))))); cout << ("%.10Lf",tmp) << endl; cin >> tmp; } <Signature goes here> Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 3, 2012 Report Share Posted March 3, 2012 pela definição, bastaria ter como base do tipo long double (algo que já estás a fazer) como sabes que retorna um float ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Flinger Posted March 3, 2012 Report Share Posted March 3, 2012 double pow(double x, double y);float powf(float x, float y); long double powl(long double x, long double y); Retorna um double. Usa a powl. http://linux.die.net/man/3/pow Link to comment Share on other sites More sharing options...
pmg Posted March 3, 2012 Report Share Posted March 3, 2012 http://linux.die.net/man/3/pow Este man da informacoes sobre C ou C++? Hint: o #include <math.h> é um bom indicador que a documentacao é para C; em C++ o correcto seria utilizar-se #include <cmath>. http://en.cppreference.com/w/cpp/numeric/math/pow What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
xtrm0 Posted March 3, 2012 Author Report Share Posted March 3, 2012 Sei que retorna um float porque no dev-cpp diz-me que está a retornar float. Estou a usar as seguintes bibliotecas: #include <iostream> #include <cmath> #include <vector> #include <utility> Com o powl, cosl e logl continua a não funcionar: #include <iostream> #include <cmath> #include <vector> #include <utility> using namespace std; int main(){ long double a=2, x=1, y=1, tmp; tmp = (powl(a,x)* cosl(y*logl(a))); cout << ("%.10L",tmp) << endl; cin >> tmp; } Output: "1.54858\n" <Signature goes here> Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 3, 2012 Report Share Posted March 3, 2012 compilei localmente e o tmp tem o valor : 1.5384778027279442531296757556980026 (verificado pelo debugger) é certo que o output só me apresentou o valor que dizes (mesmo escrevendo : "%Lf") IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pmg Posted March 3, 2012 Report Share Posted March 3, 2012 Eu nao sei C++ ... O programa abaixo tem o output que eu esperava #include <cmath> #include <iomanip> /* setprecision() */ #include <iostream> using namespace std; int main() { long double a = 2, x = 1, y = 1, tmp; tmp = pow(a, x) * cos(y * log(a)); cout << tmp << endl; cout << setprecision(10) << tmp << endl; cout << sizeof a << ' ' << sizeof x << ' ' << sizeof tmp << endl; cout << sizeof (float) << ' ' << sizeof (double) << ' ' << sizeof (long double) << endl; } 1.53848 1.538477803 16 16 16 4 8 16 Podes encontrar a documentacao para setprecision na wiki C++ reference. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
xtrm0 Posted March 3, 2012 Author Report Share Posted March 3, 2012 Já está consigo obter o output com 1.5384778027279442. No entanto, mesmo que eu aumente a precisão não me dá o valor esperado(1.5384778027279442531296757556980026). O dev-cpp diz-me que as variaveis têm sizeof = 12, no entanto, se eu as subtituir por doubles (com sizeof = 8 ) obtenho o mesmo resultado. O que estou a fazer mal desta vez? O tamanho dos long double nao devia ser o dobro dos doubles? <Signature goes here> Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 3, 2012 Report Share Posted March 3, 2012 int main(){ long double a=2, x=1, y=1, tmp; tmp = (powl(a,x)* cosl(y*logl(a))); cout << setprecision(35) << tmp << endl; cin >> tmp; } output : 1.5384778027279442531296757556980026 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
bsccara Posted March 3, 2012 Report Share Posted March 3, 2012 O que estou a fazer mal desta vez? O tamanho dos long double nao devia ser o dobro dos doubles? Não. Em tipos inteiros normalmente o long significa o dobro dos bits na representação (não sei se tal é especificado no standard do C, o pmg talvez saiba). Mas os tipos de virgula flutuante são float (4 bytes), double (8 bytes) e long double (mais precisão que o double mas não necessáriamente o dobro dos bits). Todos os tipos são baseados no standard IEEE 754-2008, que na implementação usada pelo FPU significa 32 bits para 'single precision', 64 para 'double precision' e 80 para 'extended precision'. Portanto o 'long double' do C (e do C++), na implementação para arquitecturas x86, tem 80 bits e não 128. Link to comment Share on other sites More sharing options...
xtrm0 Posted March 3, 2012 Author Report Share Posted March 3, 2012 Meu código: #include <iostream> #include <cmath> #include <vector> #include <utility> #include <iomanip> #define MINF -100 #define PINF 100 #define DELTAX 0.1 using namespace std; int main(){ long double a=2, x=1, y=1, tmp; tmp = (powl(a,x)* cosl(y*logl(a))); cout << setprecision(35) << tmp << endl; cin >> tmp; } Output: 1.5384778027279442 O meu pc tem arquitetura x64. Que compilador e que estás a usar HappyHippyHippo? <Signature goes here> Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 3, 2012 Report Share Posted March 3, 2012 x64 também .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
xtrm0 Posted March 3, 2012 Author Report Share Posted March 3, 2012 que compilador? <Signature goes here> Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 3, 2012 Report Share Posted March 3, 2012 gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pmg Posted March 3, 2012 Report Share Posted March 3, 2012 ... não sei se [em tipos inteiros o long significa o dobro dos bits] é especificado no standard do C, o pmg talvez saiba ... Não é obrigatorio que seja o dobro. O que é obrigatorio é que char <= short <= int <= long <= long long No meu compilador o char ocupa 8 bits, o short 16, o int 32, e tanto o long como o long long ocupam 64 bits. Em nuitos compiladores de Windows o char ocupa 8 bits, o short 16, o int e o long ocupam 32 bits, e o long long ocupam 64 bits. Nunca pus os dedos num Cray, mas acho que nesses super-computadores o char, o short, e o int ocupavam todos 64 bits ... The main register set consisted of eight 64-bit scalar (S) registers What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
xtrm0 Posted March 3, 2012 Author Report Share Posted March 3, 2012 Acabei de descobrir onde está o problema, o dev-cpp está a compilar os programas para 32 bits, porque tem instalado o mingw para 32 bits. Alguem sabe de alguma forma de instalar o mingw gcc para 64 bits no dev-cpp? <Signature goes here> Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now