从书中学到的一些编程小技巧

  1. 有什么好的方法来验对浮点数在 足够接近情况下的等值? 

    浮点数的定义决定它的绝对精确度会随着其代表的值变化, 所以比较两个浮 点数的最好方法就要利用一个精确的阈值。这个阈值和作比较的浮点数值大小有 关。不要用下面的代码:

    double a, b;
    ...
    if (a == b) /*
    错!*/

    要用类似下列的方法:

            #include <math.h>
            if (fabs(a - b)  <= epsilon * fabs(a))
    

    epsilon 被赋为一个选定的值来控制 接近度。你也要确定 a 不会为 0

  2. 怎样获得在一定范围内的随机数? 

    直接的方法是
    rand() % N /* 不好 */

    试图返回从 0 N 1 的数字。但这个方法不好, 因为许多随机数发生器的 低位比特并随机, 参见问题 13.16。一个较好的方法是:

        (int)((double)rand() / ((double)RAND_MAX + 1) * N)
    

    如果你不希望使用浮点, 另一个方法是: rand() / (RAND_MAX / N + 1)

    两种方法都需要知道 RAND MAX, 而且假设 N 要远远小于 RAND MAXRAND MAXANSI#define<stdlib.h>

    顺便提一下, RAND MAX是个常数,它告诉你C库函数rand()的固定范围。 你不可以设 RAND MAX 为其它的值, 也没有办法要求 rand() 返回其它范围的 值。

    如果你用的随机数发生器返回的是 0 1 的浮点值, 要取得范围在 0 N 1 内的整数, 只要将随机数乘以 N 就可以了。 

  3. 由一个日期, 怎样知道是星期几? 

       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;
        }
    

      这段代码好牛逼啊

     

  4. (year%4 == 0) 是否足够判断润年?2000 年是闰年吗? 

        year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
    
posted @ 2014-04-16 12:03  赵洪武  阅读(184)  评论(0)    收藏  举报