C 如何在没有sprintf的情况下将浮点转换为字符串?

C 如何在没有sprintf的情况下将浮点转换为字符串?,c,string,floating-point,type-conversion,C,String,Floating Point,Type Conversion,我的代码采用字符串格式并将其组合到缓冲区中(没有sprintf,itoa等) 我在将浮点数字转换为字符串时遇到问题,因为我需要具有最多7位的精度,并且没有尾随零。以及将float变量中的每个数字转换为char(但在这方面我不需要任何帮助) 我尝试了几种方法,都包括数学计算,但都没有达到预期的效果。 这是我到目前为止的代码,但它很混乱,有时给出的结果也不正确。我还相信有一种更干净、更不复杂的方法可以做到这一点。 任何帮助都将受到广泛的感谢 if (*format == 'f

我的代码采用字符串格式并将其组合到缓冲区中(没有
sprintf
itoa
等)

我在将
浮点
数字转换为
字符串
时遇到问题,因为我需要具有最多7位的精度,并且没有尾随零。以及将
float
变量中的每个数字转换为
char
(但在这方面我不需要任何帮助)

我尝试了几种方法,都包括数学计算,但都没有达到预期的效果。 这是我到目前为止的代码,但它很混乱,有时给出的结果也不正确。我还相信有一种更干净、更不复杂的方法可以做到这一点。 任何帮助都将受到广泛的感谢

            if (*format == 'f') {
                float f = *(float*)ptrs[counter];
                char str[30];
                int b, c, m, k = 7, i = 0, l = 0;
                int a = f;
                f -= a;
                while (k >= 0) {
                    l = pow(10, k);
                    m = a / l;
                    if (m > 0) {
                        break;
                    }
                    k--;
                }
                printf("%d", k);
                for (l = k + 1; l > 0; l--) {
                    b = pow(10, l - 1);
                    c = a / b;
                    str[i++] = c + 48;
                    a %= b;
                }
                str[i++] = '.';
                for (l = 0; l < 7; l++) {
                    f *= 10.0;
                    b = f;
                    str[i++] = b + 48;
                    f -= b;
                }
                for (i = 0; i < 7; i++) {
                    *buffer = str[i];
                    buffer++;
                }
                counter++;
                str[i] = '\0';
if(*格式=='f'){
浮点数f=*(浮点数*)PTR[计数器];
char-str[30];
int b,c,m,k=7,i=0,l=0;
int a=f;
f-=a;
而(k>=0){
l=功率(10,k);
m=a/l;
如果(m>0){
打破
}
k--;
}
printf(“%d”,k);
对于(l=k+1;l>0;l--){
b=功率(10,l-1);
c=a/b;
str[i++]=c+48;
a%=b;
}
str[i++]=';
对于(l=0;l<7;l++){
f*=10.0;
b=f;
str[i++]=b+48;
f-=b;
}
对于(i=0;i<7;i++){
*缓冲区=str[i];
缓冲区++;
}
计数器++;
str[i]='\0';
例如:

输入:
float v2=0.9372;

输出:
.937199

所需输出:
0.9372

输入:
float v2=0.25000;

输出:
1.25000

所需输出:
0.25

他很邋遢,有时也会给出错误的结果

考虑到典型浮点的base 2特性,程序员需要做出以下选择:

  • 接近正确答案的简短代码

  • 使用相当数量的代码进行精确正确的转换

  • 介于两者之间的东西

对于常见的浮点编码,还存在以下问题:

  • 无穷大

  • 不是一个数字

  • 像-0.0这样的怪事

如何使代码具有可移植性


不准确的来源

OP对
int
的使用将
float
限制在[int\u MIN…int\u MAX]左右。在
float
的范围之外,代码会失败。可以使用
long-long
获得更多的范围,而无需大量代码更改。更好的研究
float-modff(float-value,float*iptr)

重复使用下面的
f*=10.0
f
中的分数值,在每次迭代时注入可能的舍入(不精确)

for(l=0;l<7;l++) {
  f*=10.0;

显示a,包括调用此代码的代码、使用的输入、获得的输出和所需的输出。通常不能使用十的幂将二进制浮点格式的数字转换为十进制,因为在二进制格式中乘以或除以十的幂会增加舍入错误,使转换的数字失真。对于完整解决方案,您需要使用某种形式的扩展精度或高级技术。如果您只需要转换有限域中的数字,该域可能会有更简单的部分解决方案。您需要指定域,例如小于10^6的数字,最多转换为六个有效数字。@EricPostChil如果我理解y的话没错,我只需要最多7位的精度。@pmg不使用sprintf.comment在编辑后删除restore Monice“稍后打印7位”的确切含义是什么?此处的代码将f分为整数部分和小数部分。可能您希望先打印整数部分,然后再打印小数部分。
for(l=0;l<7;l++) {
  f*=10.0;
// ASSUME f >= 0.0, (sign handling done before here)
long long a=f;
f-=a;
int int_f = round(f*pow(10, 7));
if (int_f < 10000000) {
  later_printf_the_7_digits(int_f);
} else {
  a++;
  later_printf_the_7_digits(0);
}