第12页
- 页码:第12页
习题1.2要求写一个函数打印任意实数的所有数位。 利用
($$ int = \lfloor r \rfloor ~~~ fraction = r - int$$)来分离整数和小数部分。整数部分直接利用递归打印每一位数字,小数部分每次*10再用上述方法分离。
void print_digit(int n) { assert(n >= 0); if (n < 10) printf("%d\n", n); else { print_digit(n / 10); printf("%d\n", n % 10); } } inline void print_int(int i) { print_digit(i); } inline int decimal_equal(double d1, double d2) { const double EPSI = 0.0000001; return fabs(d1 - d2) < EPSI; } void print_fraction(double frac) { if (!decimal_equal(frac, 0.0)) { printf("%c\n", '.'); do { int i = (int)(frac * 10); frac *= 10 - i; printf("%d\n", i); }while (!decimal_equal(frac, 0.0)); } } void print_real(double r) { if (r < 0) { printf("%c\n", '-'); r = -r; } int intPart = (int)r; double fraction = r - intPart; print_int(intPart); print_fraction(fraction); }但是有一个尚没有很好解决的问题。为了确定小数部分的结束,和0.0进行比较,epsi设置为 千万分之一 。所以如果碰到超过精度之外的只能摊手。 习题1.5的第一道证明题,可以用 ($ f\left(x \right)=x-logx , \forall x > 1 $)的导数恒正 且 f‘(1) > 0来证明,至于(0, 1]的区间,显然成立。 更简洁的方法是证明 ($ logx < log2^{x} $) 这个也显然成立。 我看了下solution manual提供的答案,用的居然是数学归纳法.....真不愧是D.E.K的徒孙,这都能想到..
22人阅读
说明 · · · · · ·
表示其中内容是对原文的摘抄