C99 ajoute plusieurs fonctions et types pour un contrôle précis de l'environnement à virgule flottante. Ces fonctions permettent de contrôler divers paramètres affectant les calculs à virgule flottante, comme le mode d'arrondi, les conditions de déclenchement des exceptions, la mise à zéro des nombres, etc. Les fonctions et types de l'environnement à virgule flottante sont définis dans <fenv.h>l'en-tête ( <cfenv>en C++ ).
nombres complexes
C99 introduit un nouveau _Complexmot-clé (et complexune macro pratique ; disponible uniquement si l’ <complex.h>en-tête est inclus) qui prend en charge les nombres complexes. Tout type à virgule flottante peut être modifié avec `complex` complex, et est alors défini comme une paire de nombres à virgule flottante. Notez que C99 et C++ n’implémentent pas les nombres complexes de manière compatible ; C++ propose plutôt la classe `complex` .std::complex
Toutes les opérations sur les nombres complexes sont définies dans l' <complex.h>en-tête. Comme pour les fonctions à valeurs réelles, le suffixe «f oul » indique la variante float complex« ou » long double complexde la fonction.
Quelques fonctions plus complexes sont « réservées pour une utilisation future dans C99 ». Les implémentations sont fournies par des projets open-source qui ne font pas partie de la bibliothèque standard.
Fonctions génériques de type
L'en-tête <stdlib.h>( <cstdlib>en C++) définit plusieurs fonctions qui peuvent être utilisées pour la génération de nombres statistiquement aléatoires.
La arc4randomfamille de fonctions de nombres aléatoires n'est pas définie dans la norme POSIX, mais on la retrouve dans certaines libcimplémentations courantes. Elle désignait autrefois le générateur de flux de clés d'une version divulguée du chiffrement RC4 (d'où l'expression « un prétendu RC4 »), mais différents algorithmes, généralement issus d'autres chiffrements comme ChaCha20 , ont depuis été implémentés sous cette même appellation.
La qualité de l'aléatoire générée par `f` randest généralement trop faible pour être considérée comme statistiquement aléatoire, et elle nécessite un initialisation explicite. Il est généralement conseillé d'utiliser `f` arc4randomplutôt que `g` randlorsque cela est possible. Certaines bibliothèques C implémentent rand`f` arc4random_uniformen interne.
Fonctions spéciales
À partir de C++17 , C++ introduit des fonctions spéciales dans l' <cmath>en-tête.
Mises en œuvre
Sous les systèmes POSIX comme Linux et BSD , les fonctions mathématiques (telles que déclarées dans `math.php` <math.h>) sont regroupées séparément dans la bibliothèque mathématique . Par conséquent, si l'une de ces fonctions est utilisée, l'éditeur de liens doit recevoir la directive `math.php` . Il existe différentes implémentations, notamment :libm-lmlibm
- libm de la bibliothèque GNU libc
- La bibliothèque libm d' AMD , disponible sur GitHub , est utilisée presque telle quelle par Windows.
- Bibliothèque du compilateur Intel C++
- libm de Red Hat (Newlib)
- FDLIBM de Sun , qui a servi de base à msun de FreeBSD et à libm d' OpenBSD , lesquels ont eux-mêmes servi de base à OpenLibm de Julia .
- La bibliothèque libm de musl , basée sur BSD
libmset d'autres projets comme Arm - libm de LLVM , qui est correctement arrondi (c'est-à-dire que les erreurs par rapport au résultat mathématiquement correct sont inférieures à 0,5 unité à la dernière place )
- Le projet Arénaire utilise CRlibm (libm arrondi correctement) et son successeur MetaLibm , qui utilise l'algorithme de Remez pour générer automatiquement des approximations formellement prouvées.
- RLIBM de Rutger, qui fournit des fonctions correctement arrondies en simple précision.
CORE-MATH , correctement arrondi pour la simple et la double précision.