【发布时间】:2014-08-15 14:02:22
【问题描述】:
我尝试使用 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。
我该如何解决?
TIA
【问题讨论】:
-
你到底想要什么?
-
您期望非常大的浮点数在非常小的十进制末端非常精确。这不是浮点的工作方式。请参阅stackoverflow.com/questions/9765744/precision-in-c-floats,以及更多关于浮点精度的问题。
-
您正在使用
snprintf并明确要求它超出您的缓冲区? 为什么??? -
如果
snprintf()的第一个参数是char buffer[SOMESIZE];,第二个参数通常应该是sizeof(buffer)。指定比数组大小更大的值会引发snprintf()旨在防止的缓冲区溢出,并且在正确使用时确实可以防止。