Jump to content

Funcao long double pow()?


xtrm0
 Share

Recommended Posts

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

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

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

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

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

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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.