- 编译器:GCC 4.7.2(Debian的4.7.2-5)
- 平台:Linux 3.2.0的x86(Debian的7.1)
我试图写我自己的字符串到浮点数转换函数。它基本上是一个便宜的strtof()
ripoff,但我无法准确模拟strtof()
。我不希望我的功能完全模仿strtof()
,但我想知道它为什么会有所不同。我已经测试了几个不同的字符串,并且发现下列字符串具有不同的值,当它们被赋予我的函数时,以及strtof()
和使用printf("%.38f"))
打印时。基本字符串到浮点转换
- 1234.5678
- 44444.44444
- 333.333
- 777.777
为什么会出现这种情况? (也随意点出任何其他错误,或者告诉我其他任何字符串,也有不同的值(有没有办法可以找到他们)。)
#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <math.h>
int dec_to_f(char *dec, float *f)
{
int i = 0;
float tmp_f = 0;
if(dec == NULL) return 1;
if(f == NULL) return 2;
if(dec[i] == '\000') return 3;
if(dec[i] == '-')
{
i++;
if(dec[i] == '\000') return 3;
for(; dec[i] != '\000'; i++)
{
if(dec[i] == '.')
{
float dec_place = 10;
int power_of_ten = 1;
for(i++; dec[i] != '\000'; i++, power_of_ten++, dec_place *= 10)
{
if(dec[i] >= '0' && dec[i] <= '9')
{
if(power_of_ten > FLT_MAX_10_EXP) return 4;
else tmp_f -= (dec[i] - '0')/dec_place;
}
else return 5;
}
break;
}
if(dec[i] >= '0' && dec[i] <= '9')
{
tmp_f = tmp_f * 10 - (dec[i] - '0');
if(!isfinite(tmp_f)) return 6;
}
else return 5;
}
}
else
{
if(dec[i] == '+')
{
if(dec[i+1] == '\000') return 3;
else i++;
}
for(; dec[i] != '\000'; i++)
{
if(dec[i] == '.')
{
float dec_place = 10;
int power_of_ten = 1;
for(i++; dec[i] != '\000'; i++, power_of_ten++, dec_place *= 10)
{
if(dec[i] >= '0' && dec[i] <= '9')
{
if(power_of_ten > FLT_MAX_10_EXP) return 7;
else tmp_f += (dec[i] - '0')/dec_place;
}
else return 5;
}
break;
}
if(dec[i] >= '0' && dec[i] <= '9')
{
tmp_f = tmp_f * 10 + (dec[i] - '0');
if(!isfinite(tmp_f)) return 8;
}
else return 5;
}
}
*f = tmp_f;
return 0;
}
int main()
{
printf("FLT_MIN = %.38f\n", FLT_MIN);
printf("FLT_MAX = %f\n", FLT_MAX);
float f = 0;
int return_value = 0;
char str[256];
printf("INPUT = ");
scanf("%s", str);
return_value = dec_to_f(str, &f);
printf("return_value = %i\nstr = \"%s\"\nf = %.38f\nstrtof = %.38f\n", return_value, str, f, strtof(str, NULL));
}
你能更具体吗?你期望得到什么,取而代之的是什么? – Barmar
非常小的错误将由于四舍五入,这在处理浮点时是不可避免的。根本不是错误。如果这不是问题,你将不得不说出口。 –
“%.38f”表明您比32位(或64位)浮点数可以提供更高的精度。 – ryyker