win7 intel x64 cpu vs2013 c语言浮点数精度失真问题

采用代码穷举测试。
测试结论如下:
1、整数部分为1位时,小数部分第7位开始失真。9.0000001经过转换后为9.000000
2、整数部分为2位时,小数部分第1位开始失真。99.100000 经过转换后为 99.099998
float ftt = atof(std::string(“99.100000”).c_str());
std::string sttt = std::to_string(ftt);//sttt==99.099998
3、整数部分为3位时,小数部分第1位开始失真。999.100000经过转换后为999.099976
其他类似。
4、double失真并不比float强。测试代码省略。

float测试代码如下:

void add0_float(std::string &s, const int iCount)
{
    for (int i = s.length(); i < iCount; ++i)
    {
        s = "0" + s;//前面加0
    }
    if (s.length() < 6)//float加到6位小数
    {
        int iadd = 6 - s.length();
        for (int j = 0; j < iadd; ++j)
        {
            s += "0";//后面加0
        }
    }
}

void test_float_string()
{
    std::fstream file;
    file.open("e:/1f.txt", std::ios::app);
    for (int k = 1; k < 9; ++k)
    {
        //k个9
        std::string s9;
        for (int kk = 0; kk < k; ++kk)
        {
            s9 += "9";
        }
        s9 += ".";
        for (int j = 1; j < 8; ++j)//1-6位小数.float进度为6位小数,多的四舍五入。
        {
            int ierror = 0;
            size_t iCountPer1 = std::pow(10, j);//1切分为多少份
            for (size_t i = 0; i < iCountPer1; ++i)
            {
                std::string itemp = std::to_string(i);
                add0_float(itemp, j);
                std::string sfloat = s9 + itemp;
                float f = atof(sfloat.c_str());
                std::string sfloat2 = std::to_string(f);
                if (sfloat != sfloat2)
                {
                    file << sfloat << " != " << sfloat2 << std::endl;
                    ++ierror;
                    if (ierror > 3)
                    {
                        break;
                    }
                }
            }
        }
    }
    file.close();
}

测试输出的文件内容如下:

9.0000000 != 9.000000
9.0000001 != 9.000000
9.0000002 != 9.000000
9.0000003 != 9.000000
99.100000 != 99.099998
99.200000 != 99.199997
99.300000 != 99.300003
99.400000 != 99.400002
99.010000 != 99.010002
99.020000 != 99.019997
99.030000 != 99.029999
99.040000 != 99.040001
99.001000 != 99.000999
99.002000 != 99.001999
99.003000 != 99.002998
99.004000 != 99.003998
99.000100 != 99.000099
99.000200 != 99.000198
99.000300 != 99.000298
99.000400 != 99.000397
99.000010 != 99.000008
99.000020 != 99.000023
99.000030 != 99.000031
99.000040 != 99.000038
99.000001 != 99.000000
99.000002 != 99.000000
99.000003 != 99.000000
99.000004 != 99.000008
99.0000000 != 99.000000
99.0000001 != 99.000000
99.0000002 != 99.000000
99.0000003 != 99.000000
999.100000 != 999.099976
999.200000 != 999.200012
999.300000 != 999.299988
999.400000 != 999.400024
999.010000 != 999.010010
999.020000 != 999.020020
999.030000 != 999.030029
999.040000 != 999.039978
999.001000 != 999.000977
999.002000 != 999.002014
999.003000 != 999.002991
999.004000 != 999.004028
999.000100 != 999.000122
999.000200 != 999.000183
999.000300 != 999.000305
999.000400 != 999.000427
999.000010 != 999.000000
999.000020 != 999.000000
999.000030 != 999.000000
999.000040 != 999.000061
999.000001 != 999.000000
999.000002 != 999.000000
999.000003 != 999.000000
999.000004 != 999.000000
999.0000000 != 999.000000
999.0000001 != 999.000000
999.0000002 != 999.000000
999.0000003 != 999.000000
9999.100000 != 9999.099609
9999.200000 != 9999.200195
9999.300000 != 9999.299805
9999.400000 != 9999.400391
9999.010000 != 9999.009766
9999.020000 != 9999.019531
9999.030000 != 9999.030273
9999.040000 != 9999.040039
9999.001000 != 9999.000977
9999.002000 != 9999.001953
9999.003000 != 9999.002930
9999.004000 != 9999.003906
9999.000100 != 9999.000000
9999.000200 != 9999.000000
9999.000300 != 9999.000000
9999.000400 != 9999.000000
9999.000010 != 9999.000000
9999.000020 != 9999.000000
9999.000030 != 9999.000000
9999.000040 != 9999.000000
9999.000001 != 9999.000000
9999.000002 != 9999.000000
9999.000003 != 9999.000000
9999.000004 != 9999.000000
9999.0000000 != 9999.000000
9999.0000001 != 9999.000000
9999.0000002 != 9999.000000
9999.0000003 != 9999.000000
99999.100000 != 99999.101563
99999.200000 != 99999.203125
99999.300000 != 99999.296875
99999.400000 != 99999.398438
99999.010000 != 99999.007813
99999.020000 != 99999.023438
99999.030000 != 99999.031250
99999.040000 != 99999.039063
99999.001000 != 99999.000000
99999.002000 != 99999.000000
99999.003000 != 99999.000000
99999.004000 != 99999.007813
99999.000100 != 99999.000000
99999.000200 != 99999.000000
99999.000300 != 99999.000000
99999.000400 != 99999.000000
99999.000010 != 99999.000000
99999.000020 != 99999.000000
99999.000030 != 99999.000000
99999.000040 != 99999.000000
99999.000001 != 99999.000000
99999.000002 != 99999.000000
99999.000003 != 99999.000000
99999.000004 != 99999.000000
99999.0000000 != 99999.000000
99999.0000001 != 99999.000000
99999.0000002 != 99999.000000
99999.0000003 != 99999.000000
999999.100000 != 999999.125000
999999.200000 != 999999.187500
999999.300000 != 999999.312500
999999.400000 != 999999.375000
999999.010000 != 999999.000000
999999.020000 != 999999.000000
999999.030000 != 999999.000000
999999.040000 != 999999.062500
999999.001000 != 999999.000000
999999.002000 != 999999.000000
999999.003000 != 999999.000000
999999.004000 != 999999.000000
999999.000100 != 999999.000000
999999.000200 != 999999.000000
999999.000300 != 999999.000000
999999.000400 != 999999.000000
999999.000010 != 999999.000000
999999.000020 != 999999.000000
999999.000030 != 999999.000000
999999.000040 != 999999.000000
999999.000001 != 999999.000000
999999.000002 != 999999.000000
999999.000003 != 999999.000000
999999.000004 != 999999.000000
999999.0000000 != 999999.000000
999999.0000001 != 999999.000000
999999.0000002 != 999999.000000
999999.0000003 != 999999.000000
9999999.100000 != 9999999.000000
9999999.200000 != 9999999.000000
9999999.300000 != 9999999.000000
9999999.400000 != 9999999.000000
9999999.010000 != 9999999.000000
9999999.020000 != 9999999.000000
9999999.030000 != 9999999.000000
9999999.040000 != 9999999.000000
9999999.001000 != 9999999.000000
9999999.002000 != 9999999.000000
9999999.003000 != 9999999.000000
9999999.004000 != 9999999.000000
9999999.000100 != 9999999.000000
9999999.000200 != 9999999.000000
9999999.000300 != 9999999.000000
9999999.000400 != 9999999.000000
9999999.000010 != 9999999.000000
9999999.000020 != 9999999.000000
9999999.000030 != 9999999.000000
9999999.000040 != 9999999.000000
9999999.000001 != 9999999.000000
9999999.000002 != 9999999.000000
9999999.000003 != 9999999.000000
9999999.000004 != 9999999.000000
9999999.0000000 != 9999999.000000
9999999.0000001 != 9999999.000000
9999999.0000002 != 9999999.000000
9999999.0000003 != 9999999.000000
99999999.000000 != 100000000.000000
99999999.100000 != 100000000.000000
99999999.200000 != 100000000.000000
99999999.300000 != 100000000.000000
99999999.000000 != 100000000.000000
99999999.010000 != 100000000.000000
99999999.020000 != 100000000.000000
99999999.030000 != 100000000.000000
99999999.000000 != 100000000.000000
99999999.001000 != 100000000.000000
99999999.002000 != 100000000.000000
99999999.003000 != 100000000.000000
99999999.000000 != 100000000.000000
99999999.000100 != 100000000.000000
99999999.000200 != 100000000.000000
99999999.000300 != 100000000.000000
99999999.000000 != 100000000.000000
99999999.000010 != 100000000.000000
99999999.000020 != 100000000.000000
99999999.000030 != 100000000.000000
99999999.000000 != 100000000.000000
99999999.000001 != 100000000.000000
99999999.000002 != 100000000.000000
99999999.000003 != 100000000.000000
99999999.0000000 != 100000000.000000
99999999.0000001 != 100000000.000000
99999999.0000002 != 100000000.000000
99999999.0000003 != 100000000.000000

猜你喜欢

转载自blog.csdn.net/weixin_43172531/article/details/104017625