2016-12-21 99 views
0

在32位系统上,我发现下面的操作总是返回正确的值,但返回的是随机结果,其中a更大。32位系统中整数和浮点数之间的数学运算

uint64_t a = 14227959735; 
uint64_t b = 32768; 
float c = 256.0; 
uint64_t d = a - b/ c; // d returns 14227959808 

我相信这里的问题是,INT-漂浮的操作返回未定义的行为,但也有人有助于解释为什么它给出这样的价值呢?

+0

浮点计算只能精确到7位http://stackoverflow.com/questions/9765744/precision-in-c-floats – pm100

+1

没有什么随机或未定义的,并且你得到的结果是非常接近正确的(关闭一亿分之一)。这只是一个舍入误差。如果你使用'double'而不是'float',你会得到确切的结果,尽管对于更大的输入值你仍然可以得到舍入误差。 –

+0

有大量的问题可能是重复的;我选择的那个人的优点是成为最老的人之一(它有很好的答案)。顺便说一句,在64位系统上的结果是一样的;问题是'float'(几乎总是)使用4个字节,它不会给出很多精度的十进制数字。 –

回答

2

整个计算都是浮点运算,然后转换为64位整数。但是浮动不能准确表示大整数,除非它们碰巧是两个幂。