• cJSON精度丢失问题


    问题复现步骤:
    1) 输入字符串:
    {
        "V":0.12345678
    }


    2) 字符串转成cJSON对象


    3) 调用cJSON_Print将cJSON对象再转成字符串
    4) 再将字符串转成cJSON对象
    5) 保留8位精度方式调用printf打印值,输出变成:0.123456


    问题的原因出在cJSON的print_number函数:
    static char *print_number(cJSON *item)
    {
        char *str;
        double d = item->valuedouble;
        if (fabs(((double) item->valueint) - d) <= DBL_EPSILON && d <= INT_MAX
                        && d >= INT_MIN)
        {
            str = (char*) cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */
            if (str)
                sprintf(str, "%d", item->valueint);
        }
        else
        {
            str = (char*) cJSON_malloc(64); /* This is a nice tradeoff. */
            if (str)
            {
                if (fabs(floor(d) - d) <= DBL_EPSILON)
                    sprintf(str, "%.0f", d);
                else if (fabs(d) < 1.0e-6 || fabs(d) > 1.0e9)
                    sprintf(str, "%e", d);
                else
                    sprintf(str, "%f", d);
            }
        }
        return str;
    }


    最后一个sprintf调用没有指定保留的精度,默认为6位,这就是问题的原因。
    注:float的精度为6~7位有效数字,double的精度为15~16位。
  • 相关阅读:
    SI与EMI(一)
    设计上如何避免EMC问题
    EMC与地之重新认识地
    EMC学习之电磁辐射
    围殴拓扑和端接之终结篇
    T型及Fly_by拓扑之应用总结
    拓扑结构介绍及其种类
    [转]Verilog综合时wire和reg如何防止被优化
    Verilog基础知识0(`define、parameter、localparam三者的区别及举例)
    [转]jumbo frame介绍
  • 原文地址:https://www.cnblogs.com/aquester/p/9891488.html
Copyright © 2020-2023  润新知