【发布时间】:2018-01-05 16:04:03
【问题描述】:
static_casting 从浮点到整数只是去掉了数字的小数点。例如static_cast<int>(13.9999999) 产生13。
并非所有整数都可以表示为浮点数。例如,在内部,与 13,000,000 最接近的 float 可能是:12999999.999999。
在这个假设的情况下,我希望得到一个意想不到的结果:
const auto foo = 12'999'999.5F;
const auto bar = static_cast<long long>(ceil(foo));
我的假设是,如果不一定在 13,000,000 次,这种崩溃确实会发生在某个时间点。我只想知道我可以信任static_cast<long long>(ceif(foo)) 的范围?
【问题讨论】:
-
“最大的可表示浮点值是所有标准浮点格式中的精确整数,...”来自:en.cppreference.com/w/cpp/numeric/math/ceil
-
@RichardCritten 先生,你能解释一下我的回答吗?
-
这将由实现定义,但对于 IEEE 754 有一个欺骗目标:stackoverflow.com/questions/3793838/…
-
@NathanOliver 那么你有没有机会使用一些 IEEE 魔法来解释我的答案?这甚至在
int的范围内,这很讨厌。 -
@NathanOliver 所以我添加了一个new answer,这解释了为什么
ceil在大于(1LL << numeric_limits<T>::digits - 1LL) - 1LL的数字上不起作用。希望它是清晰的:/
标签: c++ floating-point integer static-cast ceil