Ir para o conteúdo
xtrm0

Funcao long double pow()?

Mensagens Recomendadas

xtrm0

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>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
xtrm0

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>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
xtrm0

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>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
xtrm0

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>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

... 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
xtrm0

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>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.