为什么我们不能从浮点最大值中减去?

时间:2017-11-22 00:25:52

标签: c++ floating-point

几天前,我试图从std::numeric_limits<float>::max()减去10000,我只是发现价值根本没有变化,无论我减去什么价值。事实上,似乎所有浮点类型都有这种行为。

例如(在g ++和msvc上),这个没有通过(好):

int i = std::numeric_limits<int>::max();
assert(i == i - 10000); // Doesn't pass

但是这个(?):

float f = std::numeric_limits<float>::max();
assert(f == f - 10000.f); // Pass

我甚至尝试直接指定最大值(在本例中为3.40282e + 38),但它似乎没有改变任何东西。此外,它似乎与任何足够高的值完全相同。有人可以向我解释为什么会这样做吗?感谢。

2 个答案:

答案 0 :(得分:6)

浮点数不像SET IDENTITY_INSERT [dbo].Table1 ON; INSERT INTO [dbo].Table1 ([TableId], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy]) SELECT [RoleID], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy] FROM [dbo].Table2 那样精确。你减去的数量太小而不能在significand中产生差异,它只会在精度上丢失。 int非常大(3.402823e + 38)。

如果你这样做:

std::numeric_limits<float>::max()

我确定它会失败。

答案 1 :(得分:1)

您正在达到IEEE_754浮点表示的限制。与最大浮点数相比,10000.0非常小,该值将四舍五入为std::numeric_limits<float>::max()

查看其他答案(Is floating point math broken?)中的示例以获取更多详细信息。