ft_atof.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* atof.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: salee2 <salee2@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2022/09/23 16:19:09 by salee2 #+# #+# */ 9 /* Updated: 2022/09/23 16:19:12 by salee2 ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "include/minirt.h" 14 15 long long tollp(const char *str, size_t i, int *precision) 16 { 17 long long acc; 18 const long long llmax = LONG_LONG_MAX; 19 20 acc = 0; 21 *precision = 0; 22 while (str[i]) 23 { 24 if (acc > llmax / 10 || (acc == llmax / 10 && str[i] - '0' \ 25 > (llmax % 10)) || !ft_isdigit(str[i]) || *precision >= 15) 26 exit(EXIT_FAILURE); 27 acc = acc * 10 + str[i] - '0'; 28 ++*precision; 29 ++i; 30 } 31 return (acc); 32 } 33 34 double ft_atof(const char *str) 35 { 36 size_t i; 37 double ret; 38 double sign; 39 int precision; 40 t_bool is_error; 41 42 is_error = 0; 43 ret = ft_atoi(str, &is_error, &sign); 44 if (is_error) 45 exit(EXIT_FAILURE); 46 i = 0; 47 while (str[i] && str[i] != '.') 48 ++i; 49 if (str[i] == 0) 50 return (ret); 51 if (str[i + 1] == 0) 52 exit(EXIT_FAILURE); 53 if (sign == 1) 54 ret = ret + tollp(str, i + 1, &precision) * pow(10, -1 * precision); 55 else 56 ret = ret - tollp(str, i + 1, &precision) * pow(10, -1 * precision); 57 return (ret); 58 }