2009-11-03 6 views
0

Ma question est la suivante: existe-t-il un moyen d'utiliser toujours les versions de précision étendue des fonctions mathématiques - telles que sqrt, exp, & c - sans utiliser une distribution explicite ou argument de double précision?Comment utiliser des fonctions cmath de précision étendue par préférence

Par exemple, je veux cette fonctionnalité, sans les tracas de la coulée:

float x=15.0; 
float answer; 

answer=sqrt((long double)x); 

Cela vient dans le contexte de l'informatique scientifique, où de nombreuses itérations d'une boucle contenant de telles fonctions est nécessaire. Même si à la fin du processus je n'ai besoin que d'une seule précision, les erreurs en virgule flottante qui en résultent à chaque itération peuvent totaliser quelque chose de significatif après quelques milliers d'itérations. Merci.

+1

La fonction 'sqrt()' prend un argument 'double'; la fonction 'sqrtl()' prend un argument 'long double'. – pmg

+0

J'aurais dû spécifier que j'utilise des bibliothèques C++, donc les fonctions sont surchargées comme dit MSalters. –

Répondre

2

En C

Si vous #include <math.h>, qui déclare cette fonction comme renvoyant un double et d'accepter double arguments, le compilateur fera le casting pour vous implicitily.

#include <math.h> 

/* ... */ 

int x = sqrtl(sqrt(sqrtf(42))); 
/* 1      ^^ implicit cast of int to float   */ 
/* 2    ^^^^^^^^^ implicit cast of float to double  */ 
/* 3   ^^^^^^^^^^^^^^^ implicit cast of double to long double */ 
/* 4 ^^^^^^^^^^^^^^^^^^^^^^ implicit cast of long double to int */ 
+0

Vrai en C, pas en C++ où ils sont surchargés. – MSalters

+0

En incluant cmath dans C++, vous avez également accès aux versions expl, sinl, cosl, sqrtl des fonctions mathématiques - merci pmg. –

2

Moulé pour doubler long avant la boucle et à la fin de coulée résultat de retour à la simple précision?

Questions connexes