【发布时间】:2010-04-06 00:52:27
【问题描述】:
Double 的范围大于 64 位整数,但由于其表示形式,其精度较低(由于 double 也是 64 位,它无法适应更多的实际值)。因此,当表示较大的整数时,整数部分的精度开始下降。
#include <boost/cstdint.hpp>
#include <limits>
template<typename T, typename TFloat>
void
maxint_to_double()
{
T i = std::numeric_limits<T>::max();
TFloat d = i;
std::cout
<< std::fixed
<< i << std::endl
<< d << std::endl;
}
int
main()
{
maxint_to_double<int, double>();
maxint_to_double<boost::intmax_t, double>();
maxint_to_double<int, float>();
return 0;
}
打印出来:
2147483647
2147483647.000000
9223372036854775807
9223372036854775800.000000
2147483647
2147483648.000000
请注意 max int 如何在不损失精度的情况下适合 double 而 boost::intmax_t(在这种情况下为 64 位)不能。 float 甚至不能持有 int。
现在,问题是:在 C++ 中有没有一种方法可以检查给定整数类型的整个范围是否可以在不损失精度的情况下适合浮点类型?
最好,
- 这将是一个可用于静态断言的编译时检查,
- 并且不会涉及枚举编译器应该知道或可以计算的常量。
【问题讨论】:
-
为什么要检查?整数部分有 52 位精度,这就是你得到的。
-
一旦确定了限制,就不能定义一个 CONST 吗?
-
@Billy:技术上 C++ 不需要 IEEE 754 浮点,因此假设实现使用 IEEE 754 是不可移植的(尽管 IEEE 754 无处不在)。
-
@Billy ONeal,我已经更新了问题。
标签: c++ floating-point double precision