【发布时间】:2019-03-06 01:47:26
【问题描述】:
在 C++ 中,如果 I 的范围是整数值范围的一部分,那么将 I 类型的整数值转换为浮点类型 F 将是精确的 — 与 static_cast<I>(static_cast<F>(i)) == i 一样F.
是否可以计算static_cast<F>(i) 的精度损失,如果可以,如何计算(不使用范围更广的其他浮点类型)?
首先,我尝试编写一个函数,如果转换是否安全(安全,意味着不损失精度),该函数将返回,但我必须承认我不太确定它的正确性。
template <class F, class I>
bool is_cast_safe(I value)
{
return std::abs(alue) < std::numeric_limits<F>::digits;
}
std::cout << is_cast_safe<float>(4) << std::endl; // true
std::cout << is_cast_safe<float>(0x1000001) << std::endl; // false
提前致谢。
【问题讨论】:
-
转成float再转回int,看看你得到的是不是你开始的。
-
您可能需要在这里考虑一件事:如今,几乎所有东西都使用 IEEE-754 浮点数。所以这里没有必要棘手,众所周知,此时 int->float 转换开始失去精度。有
is_iec559,可用于检查IEEE-754一致性。
标签: c++ floating-point type-conversion