从书中学到的一些编程小技巧
-
有什么好的方法来验对浮点数在 “足够接近” 情况下的等值?
浮点数的定义决定它的绝对精确度会随着其代表的值变化, 所以比较两个浮 点数的最好方法就要利用一个精确的阈值。这个阈值和作比较的浮点数值大小有 关。不要用下面的代码:
double a, b;
...
if (a == b) /*错!*/要用类似下列的方法:
#include <math.h> if (fabs(a - b) <= epsilon * fabs(a))epsilon 被赋为一个选定的值来控制 “接近度”。你也要确定 a 不会为 0。
-
怎样获得在一定范围内的随机数?
直接的方法是
rand() % N /* 不好 */试图返回从 0 到 N − 1 的数字。但这个方法不好, 因为许多随机数发生器的 低位比特并不随机, 参见问题 13.16。一个较好的方法是:
(int)((double)rand() / ((double)RAND_MAX + 1) * N)如果你不希望使用浮点, 另一个方法是: rand() / (RAND_MAX / N + 1)
两种方法都需要知道 RAND MAX, 而且假设 N 要远远小于 RAND MAX。 RAND MAX在ANSI里#define在<stdlib.h>。
顺便提一下, RAND MAX是个常数,它告诉你C库函数rand()的固定范围。 你不可以设 RAND MAX 为其它的值, 也没有办法要求 rand() 返回其它范围的 值。
如果你用的随机数发生器返回的是 0 到 1 的浮点值, 要取得范围在 0 到 N − 1 内的整数, 只要将随机数乘以 N 就可以了。
-
由一个日期, 怎样知道是星期几?
int dayofweek(int y, int m, int d) /* 0 = Sunday */ { static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; y -= m < 3; return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7; }这段代码好牛逼啊
-
(year%4 == 0) 是否足够判断润年?2000 年是闰年吗?
year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)

浙公网安备 33010602011771号