原型是一本讲算法的书的课后题,《数据结构与算法分析-C 语言描述》,原题目是“只使用处理 I/O 的 PrintDigit 函数,编写一个过程以输出任意实数”
参考代码如下:
#include <stdio.h> void PrintDigit(double , int);
int main(int argc, char **argv) { PrintDigit(12.123456,7); putchar('\n');
return 0;
}
void PrintDigit(double num, int len) { if(num < 0) { num = -num; putchar('-'); } int n = (int) num; int i=0; printf("%d",n);
num = num - n;
while(num > 0 && i < len)
{
if (i == 0)
{ // 由于 double 小数存储方式并非确定值,而是一个近似值所以采用这种方式
double add = 0.5;
int j;
for(j=0; j<len; j++)
{
add /= 10;
}
num+=add;
putchar('.');
}
num = num * 10;
n = (int) (num);
printf("%d",n);
num = num - n;
i++;
}
}
不懂的地方有两点: 1.为什么要用 0.5 来退位做加法,选用其他数是否可行 2.为什么要退位再相加才能保证精度,大概知道是因为 C 里 double 型是用指数形式存储的所以存储的其实是个近似值,但是不太懂这个保证精度的原理,能否详细讲解一下
本人新手,诚心请教各位大佬,轻喷
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.