简体   繁体   English

为什么我的字符串浮点转换函数返回的数字在纯C语言中略有不同?

[英]Why does my string to float conversion function return a number that's slightly off in pure C?

I made a program to convert strings into floats, but its slightly off. 我编写了一个程序,将字符串转换为浮点数,但略有下降。 (I know atoi and things like it exist, I just like knowing how things work). (我知道atoi及其类似事物的存在,我就像知道事物的工作原理一样)。 I've been tweaking this for some time now, and now it's a few hundred lines shorter, but still with the same error. 我已经对此进行了一段时间的调整,现在缩短了几百行,但仍然存在相同的错误。

#include <stdio.h>

int main()
{
  char input[] = "123456789.123456", numcmp[] = "0123456789-";
  int i=0, i2=0, j, k, input_size = sizeof(input)-1, num[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, power;
  float output=0, add;

  int loop1=0, loop2=0;

  printf("input size = %d\n", input_size);

  while(i<input_size)
  {
    if(input[i] == '.')
    {
      k=i-1;
      j=i+1;

      while(k>=0)
      {
        printf("loop %d in k\n", loop1);
        power=i-k;
        i2=0;
        while(input[k] != numcmp[i2])
          i2++;
        printf("i2=%d\n", i2);
        add = num[i2];
        printf("add=%f\n", add);
        power--;
        printf("power=%d\n", power);
        while(power>0)
        {
          add=add*10;
          printf("add inside of k while loop = %f\n", add);
          power--;
        }
        output = output+add;
        printf("output = %f\n\n", output);
        k--;
        loop1++;
       }
      while(j<=input_size-1)
      {
        printf("loop %d in j\n", loop1);
        power=j-i;
        i2=0;
        while(input[j] != numcmp[i2])
          i2++;
        printf("i2=%d\n", i2);
        add = num[i2];
        add = add/10; 
        printf("add=%f\n", add);
        power--;
        printf("power=%d\n", power);
        while(power>0)
        {
          add=add/10;
          printf("add inside of j while loop = %f\n", add);
          power--;
        }
        output = output+add;
        printf("output = %f\n\n", output);
        k--;
        loop2++;
       }
      break;
      }
    i++;
    }
  printf("total output = %f\n", output);
  }

When I compile this code, I get: 当我编译这段代码时,我得到:

input size = 16
loop 0 in k
i2=9
add=9.000000
power=0
output = 9.000000

loop 1 in k
i2=8
add=8.000000
power=1
add inside of k while loop = 80.000000
output = 89.000000

loop 2 in k
i2=7
add=7.000000
power=2
add inside of k while loop = 70.000000
add inside of k while loop = 700.000000
output = 789.000000

loop 3 in k
i2=6
add=6.000000
power=3
add inside of k while loop = 60.000000
add inside of k while loop = 600.000000
add inside of k while loop = 6000.000000
output = 6789.000000

loop 4 in k
i2=5
add=5.000000
power=4
add inside of k while loop = 50.000000
add inside of k while loop = 500.000000
add inside of k while loop = 5000.000000
add inside of k while loop = 50000.000000
output = 56789.000000

loop 5 in k
i2=4
add=4.000000
power=5
add inside of k while loop = 40.000000
add inside of k while loop = 400.000000
add inside of k while loop = 4000.000000
add inside of k while loop = 40000.000000
add inside of k while loop = 400000.000000
output = 456789.000000

loop 6 in k
i2=3
add=3.000000
power=6
add inside of k while loop = 30.000000
add inside of k while loop = 300.000000
add inside of k while loop = 3000.000000
add inside of k while loop = 30000.000000
add inside of k while loop = 300000.000000
add inside of k while loop = 3000000.000000
output = 3456789.000000

loop 7 in k
i2=2
add=2.000000
power=7
add inside of k while loop = 20.000000
add inside of k while loop = 200.000000
add inside of k while loop = 2000.000000
add inside of k while loop = 20000.000000
add inside of k while loop = 200000.000000
add inside of k while loop = 2000000.000000
add inside of k while loop = 20000000.000000
output = 23456788.000000

loop 8 in k
i2=1
add=1.000000
power=8
add inside of k while loop = 10.000000
add inside of k while loop = 100.000000
add inside of k while loop = 1000.000000
add inside of k while loop = 10000.000000
add inside of k while loop = 100000.000000
add inside of k while loop = 1000000.000000
add inside of k while loop = 10000000.000000
add inside of k while loop = 100000000.000000
output = 123456784.000000

loop 0 in j
i2 in j=1
add=0.100000
power in j=0
output in j = 123456784.000000

loop 1 in j
i2 in j=2
add=0.200000
power in j=1
add inside of while loop = 0.020000
output in j = 123456784.000000

loop 2 in j
i2 in j=3
add=0.300000
power in j=2
add inside of while loop = 0.030000
add inside of while loop = 0.003000
output in j = 123456784.000000

loop 3 in j
i2 in j=4
add=0.400000
power in j=3
add inside of while loop = 0.040000
add inside of while loop = 0.004000
add inside of while loop = 0.000400
output in j = 123456784.000000

loop 4 in j
i2 in j=5
add=0.500000
power in j=4
add inside of while loop = 0.050000
add inside of while loop = 0.005000
add inside of while loop = 0.000500
add inside of while loop = 0.000050
output in j = 123456784.000000

loop 5 in j
i2 in j=6
add=0.600000
power in j=5
add inside of while loop = 0.060000
add inside of while loop = 0.006000
add inside of while loop = 0.000600
add inside of while loop = 0.000060
add inside of while loop = 0.000006
output in j = 123456784.000000

total output = 123456784.000000

As you can see, it's somewhat working. 如您所见,它有些用。 The "add inside of while loop" shows the numbers are all good before being added together during "output = output + add" statements. “在while循环内添加”显示数字在“ output = output + add”语句中加在一起之前都很好。 And also, during loop 7, the integer part of the number changes from 123456789 to 123456788. 而且,在循环7期间,数字的整数部分从123456789变为123456788。

I'm baffled. 我很困惑。

An answer to your question doesn't fit into a suitable stackoverflow answer since avoiding rounding errors when reading floating point numbers is quite difficult. 您的问题的答案不适合使用合适的stackoverflow答案,因为在读取浮点数时避免舍入错误非常困难。

Here's a paper which describes the problems and gives a solution: How to read floating point numbers accurately , William D Clinger 这是一篇描述问题并给出解决方案的论文: 如何准确读取浮点数 ,William D Clinger

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 C - 为什么我的字符串在发送到 function 时返回 Null? - C - Why does my string return Null when sending it to a function? 为什么我的十六进制转换功能不可用? - Why is my hex conversion function off by one? 我的输出中的间距在C中略微偏离 - Spacing in my Output slightly off in C 当浮点数是函数的实参时,为什么我的计算机会随意更改浮点数末尾的十进制数字? - Why does my computer arbitrarily change the decimal digits at the end of a float number when that number is the actual parameter of a function? 为什么我的函数返回 0 而不是文件中的行数? - Why does my function return 0 instead of the number of lines in a file? 为什么我的C随机数发生器只返回“42”? - Why does my C random number generator only return “42”? 为什么从float隐式转换为double会在我的程序中返回一个无意义的数字? - Why does implicit casting from float to double return a nonsense number in my program? 为什么这个GNU C可变参数返回大量数字? - Why does this GNU C variadic function return a huge number? 为什么在转换为int时将浮点数在C中四舍五入? - Why does a float when converted to an int be rounded off below in C? 如果数组更长,为什么我的浮点数组中的元素显示不是数字事件? - Why does element in my float array shows that's not a number event if array is longer?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM