Définir LDBL_MAX / MIN sur C

Je travaille avec C, je dois faire un exercice dans lequel je dois imprimer la valeur long double min et long double max .

J’ai utilisé float.h comme en-tête, mais ces deux macros ( LDBL_MIN/MAX ) me donnent la même valeur que s’il s’agissait d’un double.

J’utilise Visual Studio 2015 et si je LDBL MIN la souris sur LDBL MIN le LDBL MIN #define LDBL_MIN DBL_MIN . Est-ce pour cela qu’il dbl_min au lieu de ldbl_min ?

Comment puis-je résoudre ce problème?

 printf("Type: Long Double Value: %lf Min: %e Max: %e Memory:%lu\n", val10, LDBL_MIN, LDBL_MAX, longd_size); 

C’est un problème car mon affectation nécessite deux valeurs différentes pour LDBL et DBL .

    C ne spécifie pas que long double doit avoir une précision / plage supérieure à double .

    Ainsi, même si l’implémentation les traite comme des types différents, ils peuvent avoir la même implémentation, la même plage, la même précision, la valeur minimale, la valeur maximale, etc.

    En ce qui concerne Visual Studio, MS Long Double aide.

    Pour résoudre le problème, utilisez un autre compilateur prenant long double charge long double avec une précision / plage supérieure à double . Peut-être GCC ?

    A partir de cette référence sur les types de points de déplacement :

    long double virgule flottante de précision long double étendue. Correspond au type à virgule flottante étendue IEEE-754 si elle est prise en charge, sinon correspond à un type à virgule flottante étendue non standard, tant que sa précision est meilleure que double et que la plage est au moins aussi bonne que double , sinon correspond au type double . Certaines implémentations x86 et x86_64 utilisent le type virgule flottante x87 de 80 bits.

    L’accent ajouté est à moi.

    La citation ci-dessus indique que, même si un compilateur C conforme doit avoir le type long double , il ne doit pas vraiment le prendre en charge différemment du double . Quelque chose qui est probablement le cas avec le compilateur Visual Studio C.

    Ces macros sont soit cassées, soit long double est simplement un alias de double sur votre système. Pour tester, définissez un double long sur DBL_MAX, multipliez-le par deux, puis soustrayez DBL_MAX. Si le résultat est fini, vous avez un espace exposant supplémentaire dans le double long. Si ce n’est pas le cas et si long double est plus grand que double, les octets supplémentaires peuvent simplement être un remplissage ou vous pouvez avoir le même espace d’exposant et davantage de précision. Donc, la valeur réelle de LDBL_MAX sera juste un smidgen par rapport à DBL_MAX.

    Le moyen le plus simple de générer le maximum est simplement de rechercher la représentation binary. Cependant, si vous voulez le faire en C portable, vous pouvez le tester en multipliant plusieurs fois pour obtenir la magnitude, puis remplissez la mantisse en ajoutant de manière répétée des puissances descendantes de deux jusqu’à ce que vous manquiez de précision.