2011-02-16 66 views
3

铸造(浮动)33554329L的结果是33554328.如果数字然后退回到长的值停留在33554328,有任何一个解释。浮法铸造值减1 1

在C使用VS2005 ++ [非管理]

回答

2

Floats具有非常低的精度高(3十亿+)号。

浮球的精度在0-1范围内是最好的。你从零开始越远,精度就越低。在30亿左右,它不足以保存每一个整数(所以它可以代表最接近的值)。

解决方案:使用double(或decimal representation)。

+0

的OP的数量只有约33亿美元。 – Mephane 2011-02-16 09:40:43

1

各种浮点类型表示的准确性因其大小而异。对于32位浮点数,您可以期望大约7位数的精度。对于双数是大约16位数字。

我强烈建议阅读浮点表示和各种优缺点。从长远来看,它会为您节省很多麻烦,特别是当比较之类的事情不像您期望的那样有效时。

7

32位浮点数为23位,尾数为8,388,608个不同的值。这意味着精确度大约是7位十进制数字。您的电话号码有8位十进制有效数字,因此您会看到最后一位有效数字中的精度损失。
Here's More information on float representation

双精度是64位,并具有5​​2比特用于其是4,503,599,627,370,496(16位号码)的尾数,并因此具有大致15-16十进制数字的准确性。

A decimal类型是可能允许您以任何准确度保存任何数量的任意长度的东西。 C#拥有它们,但不幸的是,它们不是C++中的原始类型。你也许可以找到一些第三方库,用C++实现它们。

+0

实际上,由于隐藏位,它是24位:标准化数字为1,非标准化数字为0。 – fredoverflow 2011-02-16 09:55:56

5

阅读this

“每个计算机科学家应该知道浮点什么”

http://www.validlab.com/goldberg/paper.pdf

+0

浮点算术已经声称另一个受害者!它似乎被它咬了一口,对每一个程序员来说都是一些礼仪。 :) – 2011-02-16 09:49:55