C - ceil/float 四舍五入为 int 保证

C - ceil/float rounding to int guarantees

我想知道在任何情况下这样的代码是否会因为浮点数不准确而出错:

#include <math.h>

// other code ...

float f = /* random but not NAN or INF */;

int i = (int)floorf(f);

// OR

int i = (int)ceilf(f);

这些值有什么保证吗?如果我有一个格式正确的 f(不是 NAN 或 INF),i 将始终是它四舍五入的整数,无论​​哪种方式。

我可以想象这样一种情况(spec/implementation 不好)您得到的值是刚好低于真实值的值,而不仅仅是 above/equal,但实际上更接近。然后,当您截断它时,它实际上会向下舍入到下一个较低的值。

我觉得不可能,因为整数可以是 ieee754 浮点数中的精确值,但我不知道 float 是否保证是那个标准

C 标准在指定 floating-point 行为方面草率,因此在技术上并未完全指定 floorf(f) 产生 f 的正确底数或 ceilf(f) 产生f.

的正确上限

尽管如此,据我所知,没有任何 C 实现会出错。

如果不是 floorf(<i>some variable</i>),你有 floorf(<i>some表达式</i>),有一些 C 实现可能会以不同的方式计算表达式,但不会得到与在整个过程中使用 IEEE-754 算术相同的结果。

如果 C 实现定义了 __STDC_IEC_559__,它应该使用 IEEE-754 算法计算表达式。

尽管如此,如果f的下限超出[=19的范围,int i = (int)floorf(f);当然不能保证将i设置为f的下限=].