当 "true" 结果不够准确时,doubles/floats 如何四舍五入?

How are doubles/floats rounded when the "true" result is not representable accurately enough?

我知道浮点数不准确。但是我的问题是结果四舍五入到哪个 "next" 数字。

是下一个更高的吗?下一个较低的?是最近的吗?

我的猜测是尾数发生了什么问题,但我不确定它是否只是被截断了,或者它是否取决于结果是否被创建"from below"(例如求和) 或 "from above"(例如差异)。

还是更简单,完全是任意的,仅取决于 compiler/architecture?

这取决于实现,但大多数遵循 IEEE 754 标准的实现都可以 select 几个舍入选项之一。

默认模式是四舍五入到最接近的可表示数字,如果出现平局,则四舍五入到偶数(即最低有效位等于零)。

有关更多信息,请参阅 https://en.m.wikipedia.org/wiki/IEEE_754

很有可能你的编译平台使用的是IEEE 754

对于基本运算,+、-、*、/,四舍五入不是随意的。 IEEE 754 定义了几个rounding modes。如果您没有明确设置一个,则默认模式是将结果四舍五入到最接近的可表示值(“四舍五入到最接近的值,接近偶数”)。这就是 IEEE 754 中对细节的关注,规则描述了当结果同样接近两个候选可表示值时要做什么。

对于更复杂的函数,例如正弦函数,这取决于实现。最不精确的实现甚至可能产生的结果不是最接近实际结果的两个可表示值中的任何一个!

David Golberg 的“每个计算机科学家都应该知道的浮点运算知识”article 每当浮点出现时,无论情愿与否,我们都经常在这个网站上推荐它,但在这种情况下,这听起来像你可能喜欢阅读。