From 31c9d8af0624454056ffb5fa5f8e4ee893b4c4ab Mon Sep 17 00:00:00 2001 From: hugogogo Date: Thu, 10 Mar 2022 16:14:01 +0100 Subject: [PATCH] d06 ex00 ajout qq tests avec limits des floats --- d06/ex00/Makefile | 3 +- d06/ex00/a.out | Bin 0 -> 13584 bytes d06/ex00/convert | Bin 62896 -> 63424 bytes d06/ex00/convert.h | 10 ++++ d06/ex00/main.cpp | 2 + d06/ex00/srcs/checkDouble.cpp | 31 +++--------- d06/ex00/srcs/checkFloat.cpp | 31 ++++-------- d06/ex00/srcs/checkInt.cpp | 16 ++---- d06/ex00/srcs/toTypes.cpp | 90 ++++++++++++++++++++++++++++++++++ d06/ex00/test_float.cpp | 36 ++++++++++++++ 10 files changed, 161 insertions(+), 58 deletions(-) create mode 100755 d06/ex00/a.out create mode 100644 d06/ex00/srcs/toTypes.cpp create mode 100644 d06/ex00/test_float.cpp diff --git a/d06/ex00/Makefile b/d06/ex00/Makefile index b407269..8709f48 100644 --- a/d06/ex00/Makefile +++ b/d06/ex00/Makefile @@ -34,7 +34,8 @@ SRCS = main.cpp \ checkChar.cpp \ checkInt.cpp \ checkFloat.cpp \ - checkDouble.cpp + checkDouble.cpp \ + toTypes.cpp D_HEADERS = . HEADERS = convert.h diff --git a/d06/ex00/a.out b/d06/ex00/a.out new file mode 100755 index 0000000000000000000000000000000000000000..aa9fe9ddc020c1875a1ebafcba56129880605a4b GIT binary patch literal 13584 zcmeHOdvIJ;89$qC+7#N&7TOY^&|4mw0@)^gkph)$noVysEu~3$6v}0@k7jWnardsK z43F3Vc8SFb&e(D4Skb}i_y?el9fpBG87R!i6ja0!o$4TNct~iWL=0Vj-?``8y?e8Z z==h&Gox9)pp65H?dEA_Hzup<>?yPaS1Q)mXoFMGxI*Zb#7)P2^1)xo|irM%*M=TOE zfzOaMi{EAeaIG?-Ofytwg&S5oN$pvMhjM94++*PS|zZ_Yf%{rp-BSik+0XC zBT+z2Ru~>sejFvoWYOd=kx6er=?y47hF+z|ko!k{qo-H#ov;HuDhx@M%BH`XVX8OI zmFN_>&ms$ktaml^$j?t(RG7qO)n2u@98mr<D6yO@aPixFnC@CIvKAd|8^BS^Q*}3uOgqQLSGEJhR0c& ztJtTwYEEI`f5B79|I0zw@Hh*NN+tPML7yiYgr;dy#S1@V!FXrPaOmQTX^dA3!`Plk zC5?<3Oq+%wjIQ1dMmUm=Y>#EkNV<2!x_BxX=?(V9BNneRXY0luvo)5=7=6J^WMx+} zW_Gj$zATKX^mR;6#WR6TottfXJ{fKzAUPGEL@<^V>$|(!*BQ%w%YCb?`gPYCD|{;v+#0Ne8S=MA zt`S}6G%3LHj2~HS(P?ku^-qGY+UTr9^rJSqGEHQWx6x0L6zgZ) zMxSG&PuS>cE0tWH*YpnIy@VKhmHaH!RcMGT_S@(*E?f@S=)4CL?_nF={+>E$quclC zQ5&7w=5p9ZSD}|IefaG z?6PQs~6 zV?z?Z6?k+Ha9LX3>B_xylb-vFKK%Olrrz$|wYR{QzI*O*G@_4v)L;8qF@sKdR`*>b)B#z&y-6bJjr`w6|&xlKHzv&5QJr0D==3hiG6N{l1zU zik~bL(D`#Iy1D1_Yk|JCjG_U%kZB^B{KtjDvHGo~{apT^K)|1^6y`wT`9sQAE#Fdf zXCAe&>Mi&HGjA+_neUTk?rFF&4ma}TMqbbTEBpa=7JY1B| z$H9&2^>>VdG=T>0wHmma8fYsvK>aK=u*+)T8r8t{KxI&hetUDbPv)`{!?#bmvdh1E z`$VCD5nKwtucYp;k?IRhK@({35|H$f+PCKez}v~mLSc_(=m}DLl7gQ9A;xc;jEZG> zBrth?V8TH;)kcB9hes?vjk%t?eIl2ApGIs%jBI&7_X?VN5=LeCCURcll-#cnX=}&@CPxBC(L|DU^7`;-L+%yo;kQ8>*>ZFw@VfNkvlT=FBode` zcZghkYzD&d1QxK2)olN8Py-9l3Y?h54`P!-rh@ znm=aWq&@J4ZT=hm+x$2AjYE4%Z5}@aU&)@@C0+a$ie)ss^)s<>L`w&g+ap>kszu|e zpqV*E$QR6zC=~9z6J11k_fFT@?#tb3r7Xs>ljexWhuLj%&7y�_$|Q0fF}U+fak)4I_O^l*a%4b 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 ZtT6jE?b1;4YwveXBFxXJOuV!G{{tzF1c literal 62896 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 diff --git a/d06/ex00/convert.h b/d06/ex00/convert.h index eb32a59..746cc80 100644 --- a/d06/ex00/convert.h +++ b/d06/ex00/convert.h @@ -17,6 +17,14 @@ bool checkInt(std::string str); bool checkFloat(std::string str); bool checkDouble(std::string str); +// templates +// see : https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl +template void toChar(T value); +template void toInt(T value); +template void toFloat(T value); +template void toDouble(T value); +//template void printDot(T value); + #define MAX_INT "2147483647" #define MIN_INT "-2147483648" #define MAX_INT_1 "2147483648" @@ -24,6 +32,7 @@ bool checkDouble(std::string str); #define INT_MAX_LENGTH 10 #define MAX_FLOAT_INT_PRECISION "16777216" #define MAX_FLOAT "340282346638528859811704183484516925440" +#define MIN_FLOAT "-340282346638528859811704183484516925440" #define FLOAT_MAX_LENGTH 39 #define MAX_DOUBLE "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" #define DOUBLE_MAX_LENGTH 309 @@ -49,6 +58,7 @@ bool checkDouble(std::string str); #define MAX_F_4 "340282346638528859811704183484516925444" #define MAX_F_5 "340282346638528859811704183484516925445" #define MAX_F_6 "340282346638528859811704183484516925446" +#define MAX_F_N "340282346638528897590636046441678635008" #define MIN_DOUBLE "-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368" #define MAX_D__1 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858367" #define MAX_D__2 "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858366" diff --git a/d06/ex00/main.cpp b/d06/ex00/main.cpp index b831ceb..41b6c1e 100644 --- a/d06/ex00/main.cpp +++ b/d06/ex00/main.cpp @@ -180,6 +180,7 @@ int main(int ac, char **av) { convert(MAX_F_4".0f"); convert(MAX_F_5".0f"); convert(MAX_F_6".0f"); + convert(MAX_F_N".0f"); //double convert("0.0"); convert("-4.2"); @@ -213,6 +214,7 @@ int main(int ac, char **av) { convert(MAX_F_4".0"); convert(MAX_F_5".0"); convert(MAX_F_6".0"); + convert(MAX_F_N".0"); convert(MAX_DOUBLE".0"); convert(MIN_DOUBLE".0"); convert(MAX_D__1".0"); diff --git a/d06/ex00/srcs/checkDouble.cpp b/d06/ex00/srcs/checkDouble.cpp index ae37981..dd06307 100644 --- a/d06/ex00/srcs/checkDouble.cpp +++ b/d06/ex00/srcs/checkDouble.cpp @@ -2,29 +2,11 @@ void fromDouble(double value) { // char - std::cout << std::setw(7) << std::left << "char"; - if (value < 0 || value > std::numeric_limits::max()) - std::cout << B_RED << "impossible" << RESET "\n"; - else if (!isprint(value)) - std::cout << B_RED << "non displayable" << RESET "\n"; - else - std::cout << B_CYAN << static_cast(value) << RESET "\n"; - + toChar(value); // int - std::cout << std::setw(7) << std::left << "int"; - if (value < std::numeric_limits::min() - || value > std::numeric_limits::max() ) - std::cout << B_RED << "impossible" << RESET "\n"; - else - std::cout << B_CYAN << static_cast(value) << RESET "\n"; - + toInt(value); // float - std::cout << std::setw(7) << std::left << "float"; - if (value < std::numeric_limits::min() - || value > std::numeric_limits::max() ) - std::cout << B_RED << "impossible" << RESET "\n"; - else - std::cout << B_CYAN << static_cast(value) << RESET "\n"; + toFloat(value); } bool isDouble(std::string str) { @@ -57,8 +39,11 @@ bool checkDouble(std::string str) { if (!isDouble(str)) return false; - std::istringstream(str) >> d; - std::cout << B_CYAN << d << B_YELLOW " double" RESET "\n"; +// std::istringstream(str) >> d; + d = strtod(str.c_str(), NULL); + std::cout << std::fixed << B_CYAN << d; +// printDot(d); + std::cout << B_YELLOW " double" RESET "\n"; fromDouble(d); return true; diff --git a/d06/ex00/srcs/checkFloat.cpp b/d06/ex00/srcs/checkFloat.cpp index 0db73d9..1ecf40a 100644 --- a/d06/ex00/srcs/checkFloat.cpp +++ b/d06/ex00/srcs/checkFloat.cpp @@ -1,29 +1,15 @@ #include "convert.h" -void fromFloat(float value) { +static void fromFloat(float value) { // char - std::cout << std::setw(7) << std::left << "char"; - if (value < 0 || value > std::numeric_limits::max()) - std::cout << B_RED << "impossible" << RESET "\n"; - else if (!isprint(value)) - std::cout << B_RED << "non displayable" << RESET "\n"; - else - std::cout << B_CYAN << static_cast(value) << RESET "\n"; - + toChar(value); // int - std::cout << std::setw(7) << std::left << "int"; - if (value < std::numeric_limits::min() - || value > std::numeric_limits::max() ) - std::cout << B_RED << "impossible" << RESET "\n"; - else - std::cout << B_CYAN << static_cast(value) << RESET "\n"; - + toInt(value); // double - std::cout << std::setw(7) << std::left << "double"; - std::cout << B_CYAN << static_cast(value) << RESET "\n"; + toDouble(value); } -bool isFloat(std::string str) { +static bool isFloat(std::string str) { size_t l; size_t l2; @@ -53,8 +39,11 @@ bool checkFloat(std::string str) { if (!isFloat(str)) return false; - std::istringstream(str) >> f; - std::cout << B_CYAN << f << B_YELLOW " float" RESET "\n"; +// std::istringstream(str) >> f; + f = strtod(str.c_str(), NULL); + std::cout << std::fixed << B_CYAN << f; +// printDot(f); + std::cout << "f" << B_YELLOW " float" RESET "\n"; fromFloat(f); return true; diff --git a/d06/ex00/srcs/checkInt.cpp b/d06/ex00/srcs/checkInt.cpp index 4585c50..b992a62 100644 --- a/d06/ex00/srcs/checkInt.cpp +++ b/d06/ex00/srcs/checkInt.cpp @@ -2,21 +2,11 @@ void fromInt(int value) { // char - std::cout << std::setw(7) << std::left << "char"; - if (value < 0 || value > std::numeric_limits::max()) - std::cout << B_RED << "impossible" << RESET "\n"; - else if (!isprint(value)) - std::cout << B_RED << "non displayable" << RESET "\n"; - else - std::cout << B_CYAN << static_cast(value) << RESET "\n"; - + toChar(value); // float - std::cout << std::setw(7) << std::left << "float" << B_CYAN - << static_cast(value) << RESET "\n"; - + toFloat(value); // double - std::cout << std::setw(7) << std::left << "double" << B_CYAN - << static_cast(value) << RESET "\n"; + toDouble(value); } bool isInt(std::string str) { diff --git a/d06/ex00/srcs/toTypes.cpp b/d06/ex00/srcs/toTypes.cpp new file mode 100644 index 0000000..180e9d5 --- /dev/null +++ b/d06/ex00/srcs/toTypes.cpp @@ -0,0 +1,90 @@ +#include "convert.h" +#include + +// tried to check for NaN and INF +//static bool is_inf_pos( float a ) { return ( *(((long*)(&a))+1) & 0xFFFFFFFFU ) == 0x7F800000U; } +//static bool is_inf_neg( float a ) { return ( *(((long*)(&a))+1) & 0xFFFFFFFFU ) == 0xFF800000U; } +//static bool is_nan( float a ) { return (( *(((long*)(&a))+1) & 0x7FF80000L ) == 0x7FF800000L); } + +// https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl +template +void toChar(T value) { + std::cout << std::setw(7) << std::left << "char"; +// if (value < 0 || value > std::numeric_limits::max()) + if (!(value >= 0 && value <= std::numeric_limits::max())) + std::cout << B_RED << "impossible" << RESET "\n"; + else if (!isprint(value)) + std::cout << B_RED << "non displayable" << RESET "\n"; + else + std::cout << B_CYAN << static_cast(value) << RESET "\n"; +} + +template +void toInt(T value) { + std::cout << std::setw(7) << std::left << "int"; +// if (value < std::numeric_limits::min() +// || value > std::numeric_limits::max() ) + if (! (value <= std::numeric_limits::max() + && value >= std::numeric_limits::min()) ) + { + std::cout << B_RED << "impossible" << RESET "\n"; + return ; + } + std::cout << B_CYAN << static_cast(value) << RESET "\n"; +} + +template +void toFloat(T value) { + std::cout << std::setw(7) << std::left << "float"; + // tricks to check if is nan and infinity + // see : https://www.jacksondunstan.com/articles/983 + // and : https://stackoverflow.com/questions/2249110/how-do-i-make-a-portable-isnan-isinf-function + if (!((value * 0) != 0)) + // min() ne renvoit que 0, il faut utiliser lowest() (c++11) ou -max() + // https://stackoverflow.com/questions/17070351/why-does-numeric-limitsmin-return-a-negative-value-for-int-but-positive-values + // https://en.cppreference.com/w/cpp/types/numeric_limits/min + if (! (value <= std::numeric_limits::max() + && value >= -(std::numeric_limits::max())) ) + { + std::cout << B_RED << "impossible" << RESET "\n"; + return ; + } + std::cout << B_CYAN << std::fixed << static_cast(value); +// printDot(value); + std::cout << "f" << RESET "\n"; +} + +template +void toDouble(T value) { + std::cout << std::setw(7) << std::left << "double" << B_CYAN + << std::fixed << static_cast(value); +// printDot(value); + std::cout << RESET "\n"; +} + +//template +//void printDot(T value) { +// std::ostringstream ostr; +// ostr << value; +// if (ostr.str().compare("inf") +// && ostr.str().compare("-inf") +// && ostr.str().compare("nan")) +// if ((ostr.str().find('.')) == std::string::npos) +// std::cout << ".0"; +//} + +template void toChar(int); +template void toChar(float); +template void toChar(double); + +template void toInt(float); +template void toInt(double); + +template void toFloat(int); +template void toFloat(double); + +template void toDouble(int); +template void toDouble(float); + +//template void printDot(float); +//template void printDot(double); diff --git a/d06/ex00/test_float.cpp b/d06/ex00/test_float.cpp new file mode 100644 index 0000000..8b2447e --- /dev/null +++ b/d06/ex00/test_float.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include + +#define MAX_INT 2147483647 +#define MIN_INT -2147483648 +#define MAX_FLOAT 340282346638528859811704183484516925440.0f +#define MIN_FLOAT -340282346638528859811704183484516925440.0f + +void isFloat(double d) { + if (! (d <= std::numeric_limits::max() + && d >= std::numeric_limits::min()) ) + { + std::cout << d << "is outside range of floats\n"; + return ; + } + std::cout << std::fixed << static_cast(d) << "\n"; +} + +int main() { + + double d; + double d2; + + d = std::numeric_limits::max(); + std::cout << std::fixed << d << "\n"; + d2 = std::nextafter(d, DBL_MAX); + std::cout << std::fixed << d2 << "\n"; +// isFloat(MAX_FLOAT); +// d = std::numeric_limits::lowest(); +// std::cout << std::fixed << d << "\n"; +// isFloat(d); + + return 0; +}