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
的下限=].
我想知道在任何情况下这样的代码是否会因为浮点数不准确而出错:
#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
的下限=].