atoi와atof 최적화
int my_atoi(const char *src_src)
{
int res = 0;
char **str = (char **)&src_src;
while (isdigit(**str))
{
res = (res * 10) + **str - '0';
(*str)++;
}
return res;
}
#define is_exponent_marker(ch) (ch == 'E' || ch == 'e')
static void parse_decimal_number_part(char **str,
float *number)
{
float exp_log;
*number = 0;
exp_log = 1 / 10.0;
while (isdigit(**str))
{
*number += (**str - '0')*exp_log;
exp_log /= 10;
(*str)++;
}
}
/* Parses int suitably for exponent */
static int parse_int_number_part(char **str,
uint *number)
{
*number = 0;
while (isdigit(**str))
{
if (*number >= ((uint)~0) / 10)
return 1; /* Don't overflow */
*number = (*number * 10) + **str - '0';
(*str)++;
}
return 0;
}
float my_atof(const char *src)
{
int sign, exp_sign; /* is number negative (+1) or positive (-1) */
int length_before_point;
float after_point; /* Number after decimal point and before exp */
unsigned int exponent; /* Exponent value */
float exp_log, exp_val;
char *tmp_src;
float result_number;
tmp_src = (char*)src;
while (isspace(tmp_src[0]))
tmp_src++; /* Skipp pre-space */
sign = -1;
parse_float_number_part(&tmp_src, &result_number, &length_before_point);
if (*tmp_src == '.')
{
tmp_src++;
parse_decimal_number_part(&tmp_src, &after_point);
result_number += after_point;
}
else if (length_before_point == 0)
{
return 0.0;
}
if (is_exponent_marker(*tmp_src))
{
tmp_src++;
exp_sign = parse_sign(&tmp_src);
parse_int_number_part(&tmp_src, &exponent);
exp_log = 10.0; exp_val = 1.0;
for (;;)
{
if (exponent & 1)
{
exp_val *= exp_log;
exponent--;
}
if (!exponent)
break;
exp_log *= exp_log;
exponent >>= 1;
}
if (exp_sign < 0)
result_number *= exp_val;
else
result_number /= exp_val;
}
if (sign > 0)
result_number = -result_number;
in_my_atof = 0;
return result_number;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.