几天前,我试图从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),但它似乎没有改变任何东西。此外,它似乎与任何足够高的值完全相同。有人可以向我解释为什么会这样做吗?感谢。
答案 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?)中的示例以获取更多详细信息。