HangOver

/*
总结:1.float的精度是6位有效数字,取值范围是10的-38次方到10的38次方,float占用4字节空间
      double的精度是15位有效数字,取值范围是10的-308次方到10的308次方,double占用8字节空间。
      浮点数相等判断;
      const float EPSINON = 0.00001;
      if ((x >= - EPSINON) && (x <= EPSINON)
      大于小于直接比较

      2.不要将数量级相差较大的两个浮点数相加,也不可将两个相近的浮点数相减
*/
#include <stdio.h>
#include <math.h>

int main()
{
    double ans[301] =
    {
        0,0.500000,0.833333,1.083333,1.283333,1.450000,1.592857,1.717857,1.828968,1.928968,2.019877,
        2.103211,2.180134,2.251562,2.318229,2.380729,2.439553,2.495108,2.547740,2.597740,2.645359,
        2.690813,2.734292,2.775958,2.815958,2.854420,2.891457,2.927171,2.961654,2.994987,3.027245,
        3.058495,3.088798,3.118210,3.146781,3.174559,3.201586,3.227902,3.253543,3.278543,3.302933,
        3.326743,3.349999,3.372726,3.394948,3.416687,3.437964,3.458797,3.479205,3.499205,3.518813,
        3.538044,3.556912,3.575430,3.593612,3.611469,3.629013,3.646255,3.663204,3.679870,3.696264,
        3.712393,3.728266,3.743891,3.759276,3.774427,3.789352,3.804058,3.818551,3.832837,3.846921,
        3.860810,3.874509,3.888022,3.901356,3.914514,3.927501,3.940321,3.952979,3.965479,3.977825,
        3.990020,4.002068,4.013973,4.025738,4.037366,4.048860,4.060224,4.071459,4.082571,4.093560,
        4.104429,4.115182,4.125820,4.136346,4.146763,4.157072,4.167277,4.177378,4.187378,4.197279,
        4.207082,4.216791,4.226407,4.235930,4.245364,4.254710,4.263969,4.273144,4.282235,4.291244,
        4.300172,4.309022,4.317794,4.326489,4.335110,4.343657,4.352132,4.360535,4.368868,4.377133,
        4.385329,4.393460,4.401524,4.409524,4.417461,4.425335,4.433147,4.440899,4.448591,4.456225,
        4.463801,4.471319,4.478782,4.486190,4.493543,4.500842,4.508088,4.515282,4.522425,4.529517,
        4.536560,4.543553,4.550497,4.557394,4.564243,4.571046,4.577803,4.584514,4.591181,4.597803,
        4.604382,4.610918,4.617412,4.623863,4.630273,4.636643,4.642972,4.649261,4.655511,4.661722,
        4.667895,4.674030,4.680128,4.686188,4.692212,4.698201,4.704153,4.710070,4.715952,4.721800,
        4.727614,4.733395,4.739142,4.744856,4.750538,4.756188,4.761806,4.767392,4.772948,4.778473,
        4.783967,4.789432,4.794866,4.800272,4.805648,4.810996,4.816315,4.821606,4.826869,4.832105,
        4.837313,4.842494,4.847649,4.852777,4.857879,4.862955,4.868006,4.873031,4.878031,4.883006,
        4.887957,4.892883,4.897785,4.902663,4.907517,4.912348,4.917156,4.921940,4.926702,4.931442,
        4.936159,4.940853,4.945526,4.950177,4.954807,4.959415,4.964003,4.968569,4.973114,4.977639,
        4.982144,4.986628,4.991092,4.995537,4.999961,5.004367,5.008753,5.013119,5.017467,5.021796,
        5.026107,5.030399,5.034672,5.038927,5.043165,5.047384,5.051586,5.055770,5.059936,5.064086,
        5.068218,5.072333,5.076432,5.080513,5.084578,5.088627,5.092659,5.096675,5.100675,5.104659,
        5.108628,5.112580,5.116517,5.120439,5.124345,5.128236,5.132112,5.135973,5.139819,5.143651,
        5.147467,5.151270,5.155058,5.158831,5.162590,5.166336,5.170067,5.173785,5.177488,5.181178,
        5.184855,5.188518,5.192167,5.195804,5.199427,5.203037,5.206634,5.210218,5.213790,5.217349,
        5.220895,5.224428,5.227949,5.231458,5.234955,5.238439,5.241911,5.245371,5.248820,5.252256,
        5.255681,5.259094,5.262495,5.265885,5.269263,5.272630,5.275986,5.279331,5.282664,5.285986
    };
    int i;
    double j;
    while(scanf("%lf", &j), j)  //这里不应该是j-0.0 > 0.0001
    {
        int answer = 0;
        for (i = 1; i < 301; i++)
        {
            if (ans[i] >= j)    //不要将ans[i]与j做减法,double的精度高,
            {                   //用0.000001时远远不够的,直接用0比较
                answer = i;
                break;
            }
        }
        printf("%d card(s)\n", answer);
    }
    return 0;
}

  相近浮点数相减很容易出错:

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    float a =   0.00001;
    cout << setprecision(10);
    cout << a << endl;
    cout << a - 0.00001 << endl;
    if (a -     0.00001 <= 0)
    {
        cout << "less" << endl;
    }
    else
    {
        cout << "greater" << endl;
    }
    return 0;
}
/*
    9.999999747e-006
    -2.526212492e-013
    less
*/

  

转载于:https://www.cnblogs.com/bamboo-talking/archive/2011/09/14/2176638.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值