C++ 6位数字不能保证单精度吗?

C++ 6位数字不能保证单精度吗?,c++,floating-point,C++,Floating Point,以下是: 存储为二进制的十进制数正确地保留了9999978e3和99999979E3的第6位数字,即7,但999990E3的第6位数字是8,而不是9 浮点精度不应该总是保证前6位吗 是的,如果我第89轮,我得到了9,但那不一样;这只在视觉上有效/有意义 稍后在处理数字时,当我对该值应用数学时,它将在XXXXX 8号99999760上工作,而不是在XXXXX 9上工作+1在那个数量级。不是你认为可以保证的,不是 通过提供一个反例,对于IEEE754单精度浮点,最接近 9999990000 是 可

以下是:

存储为二进制的十进制数正确地保留了9999978e3和99999979E3的第6位数字,即7,但999990E3的第6位数字是8,而不是9

浮点精度不应该总是保证前6位吗

是的,如果我第89轮,我得到了9,但那不一样;这只在视觉上有效/有意义


稍后在处理数字时,当我对该值应用数学时,它将在XXXXX 8号99999760上工作,而不是在XXXXX 9上工作+1在那个数量级。

不是你认为可以保证的,不是

通过提供一个反例,对于IEEE754单精度浮点,最接近

9999990000

可以保证的是,当您的数字和浮动都四舍五入到六位有效数字时,它们将是相同的。这是平台上FLT_DIG的值,假设它实现了IEEE754。例如,最接近999979000的浮点数是99997496


不是以你认为有保证的方式,不是

通过提供一个反例,对于IEEE754单精度浮点,最接近

9999990000

可以保证的是,当您的数字和浮动都四舍五入到六位有效数字时,它们将是相同的。这是平台上FLT_DIG的值,假设它实现了IEEE754。例如,最接近999979000的浮点数是99997496


请参见

您永远无法获得以10为基数的精确数字,因为数字不是以10为基数存储的,而且大多数以10为基数的分数在以2为基数时没有完美的表示形式。几乎总是存在舍入误差,通过重复相加,可以放大舍入误差

例如,1/5具有以下二进制模式:

111110010011001100110011001101
我们只关心你所说的最后23位尾数

10011001100110011001101
注意1001的重复模式。要真正表示0.2,该模式必须永远重复,而不是以舍入1结束

将该数字乘以足够的数值,舍入误差将被放大


如果您需要精确的小数位数,那么使用整数数学,在除法的情况下,您可以自己处理舍入问题,并以您满意的方式进行处理。或者使用一个bigint库和有理数,最终得到巨大的分数,这需要花费很长时间来计算,但你将拥有无限的精度。当然,任何不能像sqrt6或pi那样表示为有理数的数字仍然会有舍入误差。

你永远不会得到以10为基数的精确数字,因为数字不是以10为基数存储的,大多数以10为基数的分数在以2为基数时没有完美的表示。几乎总是存在舍入误差,通过重复相加,可以放大舍入误差

例如,1/5具有以下二进制模式:

111110010011001100110011001101
我们只关心你所说的最后23位尾数

10011001100110011001101
注意1001的重复模式。要真正表示0.2,该模式必须永远重复,而不是以舍入1结束

将该数字乘以足够的数值,舍入误差将被放大


如果您需要精确的小数位数,那么使用整数数学,在除法的情况下,您可以自己处理舍入问题,并以您满意的方式进行处理。或者使用一个bigint库和有理数,最终得到巨大的分数,这需要花费很长时间来计算,但你将拥有无限的精度。当然,任何不能像sqrt6或pi那样表示为有理数的数字仍然会有舍入误差。

6位数字绝对不能保证如果将最多6位有效数字的十进制字符串转换为IEEE 754单精度表示,然后转换回具有相同位数的十进制字符串,最终结果应与原始字符串匹配。在考虑舍入时,6位数字是有保证的。我不明白你为什么说你不接受这个问题。@markzzz你说的应用数学是什么意思?你为什么认为没有舍入呢?@markzzz当你应用数学时,也没有十进制数字,所以我不理解其意义。数字仍然接近9999990e3,而不是99999980E3。6位数字绝对不能保证。如果将最多6位有效数字的十进制字符串转换为IEEE 754单精度表示,然后再转换回具有相同位数的十进制字符串,则最终结果应与原始字符串匹配。在考虑舍入时,6位数字是有保证的。我不明白你为什么说你不接受这个问题。@markzzz你说的应用数学是什么意思?你为什么认为没有舍入呢?@markzzz当你应用数学时,也没有十进制数字,所以我不理解其意义。这个数字仍然接近999990E3而不是999980E3。真的吗?这个g
从6到9位有效十进制数字的精度。如果将最多具有6个有效数字的十进制字符串转换为IEEE 754单精度表示,然后再转换回具有相同位数的十进制字符串,则最终结果应与原始字符串匹配。如果将IEEE 754单精度数字转换为具有至少9个有效数字的十进制字符串,然后再转换回单精度表示,则最终结果必须与原始数字匹配。错了吗?我认为维基百科的引文应该说或者应该读为。。然后转换回具有相同有效位数的十进制字符串。。这意味着,否则它就没有任何意义。因此,6位有效数字只意味着,一旦对转换后的十进制值进行四舍五入,起始十进制数等于转换后的十进制数。因此,基本上,它保证两个小数点之间的ULP大约为+-0.5?Re:“…您的数字和浮点,当二者都四舍五入到七个有效数字时…将是相同的。”七是不保证的。32位二进制IEEE-754,printf%.7g,9.999979e9f;收益率为“9.999978e+09”。这就是为什么在使用IEEE-754时,C中的FLT是6。真的吗?这将提供6到9个有效十进制数字的精度。如果将最多具有6个有效数字的十进制字符串转换为IEEE 754单精度表示,然后再转换回具有相同位数的十进制字符串,则最终结果应与原始字符串匹配。如果将IEEE 754单精度数字转换为具有至少9个有效数字的十进制字符串,然后再转换回单精度表示,则最终结果必须与原始数字匹配。错了吗?我认为维基百科的引文应该说或者应该读为。。然后转换回具有相同有效位数的十进制字符串。。这意味着,否则它就没有任何意义。因此,6位有效数字只意味着,一旦对转换后的十进制值进行四舍五入,起始十进制数等于转换后的十进制数。因此,基本上,它保证两个小数点之间的ULP大约为+-0.5?Re:“…您的数字和浮点,当二者都四舍五入到七个有效数字时…将是相同的。”七是不保证的。32位二进制IEEE-754,printf%.7g,9.999979e9f;收益率为“9.999978e+09”。这就是为什么在使用IEEE-754时,C中的FLT_DIG为6。