代码段一:
char* str="9.20";
double d=atof(str);
d=d*100;
long a=d;代码段二:
double a1=920.00000000000;
long a=a1;
结果代码段一的a值是919,代码段二的a值是920,问题出在哪里?(在VC6.0下编译)

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3101/3101122.xml?temp=.1809961
      

  2.   

    long a = d / 0.99999999;
      

  3.   


    double 的存储形式
    1bit 符号 11 bit 指数(2进制) 52bit有效值部分
    920.0000 直接转换成2进制的科学记数法
    9.2 * 100 
    9.2和100被分别拆成科学记数法,再计算,共产生了三次误差
      

  4.   

    float的存储形式参考一下00000000 00000000 001000 00100000 0
    -------  -------  ------ --------
    8位      8位      7位
    -----------------------
     有效部分,右边是高位,所以是1/8
    有效值为1+1*(八分之一) = 1.25
    符号位1bit
    指数部分exp, 8bit 范围[0,255]
    有次数部分value,23bit,范围[0,max],max的值是23位全部是1
    为正:
    [ 1 + 1 * ((float)value/max)] * 2^(exp - 127)
    0x00 0x00 0x80 0x3f
    倒置
    0x3f800000
    0       01111111   0000000 00000000 00000000  
    ---     -------    -------------------------
    符号   指数127     有效部分0结果为 (1+ 1 * 0) * 2的(127-127)次方 = 10x00 0x00 0x20 0x40
    倒置
    0x40 0x20 0x00 0x00
    0      10000000    0100000 00000000 00000000
    -----  --------    -------------------------
    1bit   8bit        23bit,最大值为1/4故为 (1+1*(1.0/4)) * 2的(128 -127)次方 = 1.25 * 2 = 2.5include <stdio.h>
    #include <math.h>
    #include <memory.h>int main()
    {
        int int_1 = 2;
        float float_2 = 2.5;
        char temp[5]="0000";
    memcpy(temp,&float_2,4);
     /*   printf("%f, %d\r\n", int_1, float_2);    
        printf("%f", pow(2, 30)+ pow(2, 21)); 
        
    scanf("%d",int_1);*/
        return 0;
    }---------------------------
    技术上可行
    符合你的要求吗?
    如果不明白
    请给我发短消息
    请附: 帖子的地址
    或在
    http://www.338888.com/VCShare/Default.asp
    上提问
      

  5.   

    he_zhidan(何志丹:风云伐日) ( ) 志 丹分析 好深入 慢慢看,不懂大家就骚扰他。呵呵