【发布时间】:2016-08-10 11:42:34
【问题描述】:
我想检查一个 long long 变量是否可以安全地转换为 double。 DBL_MAX 无济于事,因为有一些小于 double 的整数不能表示,而一些大于 2^53 的整数仍然可以适应。
有没有可靠的方法来做到这一点? 编译器可以优化如下语句吗?
(long long)((double)a) == a(其中a 是long long)
这不要求一个可以表示为双精度的最大整数,我要求一个通用函数来检查我是否可以精确地转换anylong long值翻倍而不会出错。
【问题讨论】:
-
你能定义一下“安全地转换成双精度”是什么意思吗?
-
如果
a大于pow(2, 53),测试a的最后一位是否为零?clz(abs(a)) + ctz(abs(a)) > 64 - 53? -
我想作者是在问:“当我将
long long整数存储到double时,我如何确保没有舍入错误,因为存在 double 无法存储的整数值?” -
使用最常见的 IEEE754 浮点实现,这是不可能的。
-
我认为你的表达式很好,除了一个大整数,其中 (double) a 等于 2^63,你需要检查转换回 long long 是否可能是未定义的行为。
标签: c type-conversion floating-accuracy