我试着用snprintf把一些数字转换成字符串。name1在逗号后的数字应与name2相同。

  #include <stdio.h>
  #define length 50

  int main()
  {
  char name1 [length];
  char name2 [length];
  double step= 0.00001;
  unsigned long long int iterMax  =100000000000;
  int k;

  for (k = 0; k <= 20; k++)
    { printf("numbers :  k = %2d ; k*step = %f ;", k, k*step);
      snprintf(name1,length+1,"%f", iterMax+k*step); /* */
      snprintf(name2,length+1, " %f", k*step); /*  */
      printf("strings : k*step =  %s ; iterMax+k*step = %s \n",name2, name1);
    }
  return 0;
}

编译时使用:
 gcc t.c  -Wall

输出为:
./a.out
numbers :  k =  0 ; k*step = 0.000000 ;strings : k*step =   0.000000 ; iterMax+k*step = 100000000000.000000
numbers :  k =  1 ; k*step = 0.000010 ;strings : k*step =   0.000010 ; iterMax+k*step = 100000000000.000015
numbers :  k =  2 ; k*step = 0.000020 ;strings : k*step =   0.000020 ; iterMax+k*step = 100000000000.000015
numbers :  k =  3 ; k*step = 0.000030 ;strings : k*step =   0.000030 ; iterMax+k*step = 100000000000.000031
numbers :  k =  4 ; k*step = 0.000040 ;strings : k*step =   0.000040 ; iterMax+k*step = 100000000000.000046

当iterMax较小时,结果相同(逗号后的数字),例如100000000:
numbers :  k =  0 ; k*step = 0.000000 ;strings : k*step =   0.000000 ; iterMax+k*step = 100000000.000000
numbers :  k =  1 ; k*step = 0.000010 ;strings : k*step =   0.000010 ; iterMax+k*step = 100000000.000010
numbers :  k =  2 ; k*step = 0.000020 ;strings : k*step =   0.000020 ; iterMax+k*step = 100000000.000020
numbers :  k =  3 ; k*step = 0.000030 ;strings : k*step =   0.000030 ; iterMax+k*step = 100000000.000030
numbers :  k =  4 ; k*step = 0.000040 ;strings : k*step =   0.000040 ; iterMax+k*step = 100000000.000040

ULLONG_MAX=18446744073709551615大于iterMax。
我该怎么解决?
短暂性脑缺血发作

最佳答案

这实际上是一个精度问题。关于IEEE-754浮点数还有很多其他的问题,我将在这里总结相关的几点:
double和family以有限的精度有效地以科学记数法存储数字。这意味着这个数字越大,就越不准确。
大多数数字使用基数2。因此,十进制数不能精确存储(相反,它类似于double
因此,数字0.1是“大”的,因此在小数点后变得不太准确。事实上,一旦你接近0.10000000149011612,你甚至不能存储所有整数!

10-05 20:25