OVH Cloud OVH Cloud

std::abs() ?

11 réponses
Avatar
Benoit Dejean
existe-t-il une telle fonction template ? si oui, quelle entete faut il
utiliser, sinon lire la suite

il existe abs, labs, et fabs dans <cmath> et <cstdlib> mais qui comme les
autres fonctions mathématiques ne sont définies que pour un type
défini. C99 pallie ce problème avec <tgmath.h> en définissant pour
chaque fonction de <math.h> une version pour {float, double, long double}

donc je commence à utiliser <tgmath.h> présent sur mon système. je
tombe ensuite sur

http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1422.html

qui définit

# circular, a.k.a. trigonometric (§7.12.4): sin, cos, tan, asin, acos,
atan and atan2; # hyperbolic (§7.12.5): sinh, cosh, tanh, asinh, acosh,
atanh; # exponential (§7.12.6): exp, exp2, frexp, ldexp, expm1; #
logarithmic (§7.12.6): log10, log2, logb, ilogb, log1p; # power
(§7.12.7): pow, sqrt, cbrt, hypot; # special (§7.12.8): erf, erfc,
tgamma, lgamma;


point de fonction pour calculer la valeur absolue. je réfléchi un peu,
et me dit qu'elle existe peut être déjà (comme min, max et swap). mais
je n'arrive pas à mettre la main dessus

10 réponses

1 2
Avatar
Gabriel Dos Reis
Benoit Dejean writes:

| existe-t-il une telle fonction template ?

Non et oui.

[...]

| point de fonction pour calculer la valeur absolue. je réfléchi un peu,
| et me dit qu'elle existe peut être déjà (comme min, max et swap). mais
| je n'arrive pas à mettre la main dessus

Pourquoi veux-tu absolument une telle fonction template ?

-- Gaby
Avatar
Benoit Dejean
Le Sun, 05 Oct 2003 19:25:49 +0200, Gabriel Dos Reis a écrit :

Benoit Dejean writes:

| existe-t-il une telle fonction template ?

Non et oui.

[...]

| point de fonction pour calculer la valeur absolue. je réfléchi un
peu, | et me dit qu'elle existe peut être déjà (comme min, max et
swap). mais | je n'arrive pas à mettre la main dessus

Pourquoi veux-tu absolument une telle fonction template ?


je n'ai pas dis forcément template. pourquoi pas template, puisque son
utilisation me semble assez générale. je veux juste ne pas avoir à me
soucier du type comme actuellement.

template<typename T>
T abs(const T &i)
{
return i < T(0) ? -i : i;
}

donc en ce moment j'utilise ceci avec des spécialisation utilisant
<tgmath.h> du C99.

je lis les papiers post-Oxford et le
pre-Kona prenant en compte de fonctions mathématiques multiples, et je ne
vois nulle part une fonction pour faire le calcul de valeur absolu. oublie
? ma méthode est elle là bonne en attendant ?

Avatar
Gabriel Dos Reis
Benoit Dejean writes:

| Le Sun, 05 Oct 2003 19:25:49 +0200, Gabriel Dos Reis a écrit :
|
| > Benoit Dejean writes:
| >
| > | existe-t-il une telle fonction template ?
| >
| > Non et oui.
| >
| > [...]
| >
| > | point de fonction pour calculer la valeur absolue. je réfléchi un
| > peu, | et me dit qu'elle existe peut être déjà (comme min, max et
| > swap). mais | je n'arrive pas à mettre la main dessus
| >
| > Pourquoi veux-tu absolument une telle fonction template ?
|
| je n'ai pas dis forcément template.

Ah ?!?

| pourquoi pas template,

On écrit un template lorsque cela se justifie :-)

| puisque son utilisation me semble assez générale.

Oui, mais une surcharge peut aussi faire l'affaire, non ?

| je veux juste ne pas avoir à me soucier du type comme actuellement.

C'est déjà chose faite ; tu l'as dit toi-même : <cmath> et <cstdlib>.
(si tu protestes contre le fait d'avoir de telles surchages dans
pluieurs entêtes, je suis d'accord avec toi.)

| template<typename T>
| T abs(const T &i)
| {
| return i < T(0) ? -i : i;
| }

c'est *trop* général.

| donc en ce moment j'utilise ceci avec des spécialisation utilisant
| <tgmath.h> du C99.

<tgmath.h> est là parce que C ne oeut pas écrire surcharge. À part ça, ...

| je lis les papiers post-Oxford et le
| pre-Kona prenant en compte de fonctions mathématiques multiples, et je ne
| vois nulle part une fonction pour faire le calcul de valeur absolu. oublie
| ? ma méthode est elle là bonne en attendant ?

pourquoi ne pas t'en tenir aux classiques ?

-- Gaby
Avatar
Benoit Dejean
Le Sun, 05 Oct 2003 20:18:01 +0200, Gabriel Dos Reis a écrit :

| donc en ce moment j'utilise ceci avec des spécialisation utilisant |
<tgmath.h> du C99.

<tgmath.h> est là parce que C ne oeut pas écrire surcharge. À part
ça, ...


certes


| je lis les papiers post-Oxford et le | pre-Kona prenant en compte de
fonctions mathématiques multiples, et je ne | vois nulle part une
fonction pour faire le calcul de valeur absolu. oublie | ? ma méthode
est elle là bonne en attendant ?

pourquoi ne pas t'en tenir aux classiques ?


ben parce qu'en fait je ne trouvais nulle par que

float fabs(float f);
double fabs(double);
long double fabs(long double);

étaient définis d'ou mon problème. désolé pour la question bête.

d'ailleurs j'essaie à l'instant

#include <iostream>
#include <typeinfo>
#include <cstdlib>
using namespace std;

template<typename T>
void Fabs()
{
cout << typeid(T).name() <<'t' << ( (typeid(T)==typeid(fabs(T()))) ?
"OK" : "Aïe" ) << endl;
}

template<typename T>
void Abs()
{
cout << typeid(T).name() << 't' << ( (typeid(T)==typeid(abs(T()))) ?
"OK" : "Aïe" ) << endl;
}

int main()
{
Fabs<float>();
Fabs<double>();
Fabs<long double>();

Abs<signed char>();
Abs<short int>();
Abs<int>();
Abs<long int>();
};


sur mon système GNU/Linux avec g++3.3.2

f OK
d OK
e OK
a Aïe
s Aïe
i OK
l OK


si mon programme est correct, le problème existe donc (ou il y a encore
des fonctions sur lesquels je n'arrive pas à mettre la main ?)

Avatar
Benoit Dejean
Le Sun, 05 Oct 2003 20:40:30 +0200, Benoit Dejean a écrit :

Le Sun, 05 Oct 2003 20:18:01 +0200, Gabriel Dos Reis a écrit :

bon allez, je suis nul, je vois les problèmes ou il ne sont pas, faut

vraiment que je me trouve une documentation papier sur la bilbliothèque
standard (pourquoi y a pas ça à la fin du TC++PL comme à la fin du K&R
?)

merci. désolé du dérangement.

Avatar
Michel Michaud
Dans news:, Benoit


bon allez, je suis nul, je vois les problèmes ou il ne sont pas,

faut vraiment que je me trouve une documentation papier sur la
bilbliothèque standard (pourquoi y a pas ça à la fin du TC++PL
comme à la fin du K&R ?)

merci. désolé du dérangement.


Comme je ne suis pas certain que tu as trouvé la bonne réponse (si
tu as bien décodé les messages de Gabriel, bravo), je signale pour
clarifier que abs est surchargé en C++, donc on a des abs acceptant
divers types, dont des types templates (donc on a aussi des
versions templates spécifiques d'abs), en plus des fabs, etc.,
hérités de C.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Michaël Monerau
Benoit Dejean wrote:

bon allez, je suis nul, je vois les problèmes ou il ne sont pas, faut
vraiment que je me trouve une documentation papier sur la
bilbliothèque standard (pourquoi y a pas ça à la fin du TC++PL comme
à la fin du K&R ?)


A la fin du TC++PL, enfin, sur toute la troisième partie (dans la troisième
édition), toute la STL est expliquée détails (même si d'autres livres
peuvent en rajouter sur le sujet)... Quelle édition du bouquin as-tu ?
--
<=- Michaël "Cortex" Monerau -=>

Avatar
Benoit Dejean
Le Mon, 06 Oct 2003 05:27:35 +0000, Michaël Monerau a écrit :

Benoit Dejean wrote:

bon allez, je suis nul, je vois les problèmes ou il ne sont pas, faut
vraiment que je me trouve une documentation papier sur la
bilbliothèque standard (pourquoi y a pas ça à la fin du TC++PL comme
à la fin du K&R ?)


A la fin du TC++PL, enfin, sur toute la troisième partie (dans la
troisième édition), toute la STL est expliquée détails


introduite plutôt. je cherche abs dans l'index et la seule chose que je
trouve c'est que abs est ici et fabs là-bas?

(même si d'autres livres
peuvent en rajouter sur le sujet)... Quelle édition du bouquin as-tu ?


la dernière.


Avatar
Benoit Dejean
Le Sun, 05 Oct 2003 22:45:14 -0400, Michel Michaud a écrit :

Comme je ne suis pas certain que tu as trouvé la bonne réponse (si tu
as bien décodé les messages de Gabriel, bravo), je signale pour
clarifier que abs est surchargé en C++, donc on a des abs acceptant
divers types, dont des types templates (donc on a aussi des versions
templates spécifiques d'abs), en plus des fabs, etc., hérités de C.


merci bien. tu peux m'en dire plus sur les versions acceptant des types
templates ?

Avatar
Gabriel Dos Reis
Benoit Dejean writes:

| Le Sun, 05 Oct 2003 22:45:14 -0400, Michel Michaud a écrit :
|
| > Comme je ne suis pas certain que tu as trouvé la bonne réponse (si tu
| > as bien décodé les messages de Gabriel, bravo), je signale pour
| > clarifier que abs est surchargé en C++, donc on a des abs acceptant
| > divers types, dont des types templates (donc on a aussi des versions
| > templates spécifiques d'abs), en plus des fabs, etc., hérités de C.
|
| merci bien. tu peux m'en dire plus sur les versions acceptant des types
| templates ?

complex<T>, valarray<T>


-- Gaby
1 2