c - 将 char[8] 转换为 double 时出现舍入问题

标签 c floating-point

<分区>

Possible Duplicate:
Floating point inaccuracy examples

我正在尝试将 char 数组转换为 double 组,但我在小数点的最后一个精度处进行了某种舍入。请看下面的代码。

#include <stdio.h>

#define INT32MAX 017777777777 
#define LIND 0
#define MIND 1

typedef int Int32;  
typedef unsigned int UInt32;  
typedef short int Int16;  

union _talign  
{  
    double        _doubles[2];  
    double        _double;  
    Int32         _long[4];  
    UInt32        _unsign[4];  
    Int16         _short[8];  
    float         _float[4];  
    char          _char[16];  
    long long     _BIGINT;  
};  

int main()  
{  
    union  _talign value;  
    double dval = 0.0;  
    double dmag = 1000000.0000000000;  
    int i=0;  
    char cp[8] = { 135,55,83,03,178,67,55,0};  

    for(i=0;i<8;i++)  
        value._char[i] = cp[i];  

    dval = (double)value._long[MIND];  
    dval = ((double)INT32MAX + 1.0) * dval * 2.0;  
    dval = (dval +  value._long[LIND]) / dmag ;  

    printf("Expecting dval = 15555555558.111111\n");  
    printf("Got dval = %lf\n",dval);  

    return 0;  
}  

我期望 dval 为 15555555558.111111,但程序返回 15555555558.111113。 因此,任何人都可以想出正确的最后一个精度或任何其他方法来进行这种转换。您的建议将不胜感激。谢谢

最佳答案

问题是所有 float 都不能用有限的数字精确表示。浮点类型尽其所能,但在这种情况下,您不能将您的特定数字完全表示为 double。 15555555558.111113 将是您能做的最好的,除非您求助于任意精度小数的库。

关于c - 将 char[8] 转换为 double 时出现舍入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1315372/

相关文章:

c - 缓冲区溢出漏洞: sh: 1: Syntax error: Unterminated quoted string : Developing exploit for personal enrichment

c++ - volatile 功能

c++ - 如何将多个 fma 操作链接在一起以提高性能?

c - 如何将 float 舍入到给定的小数精度

c - 用 C 编写的代码不适用于 Visual Studio

c - 使用内存中的多个空字符操作 C 字符串

c - 在套接字上使用 O_NONBLOCK 后,有没有办法避免 HUP?

python - 在python中,我如何用小数点分割一个数字

python - python 中的 float 的奇怪问题

java - 为什么在 java 中对于 long 和 double 具有相同的值会有不同的结果