c - 浮点转换假设 : (int)(float)n == n

标签 c ieee-754 floating-point-conversion

我可以假设 (int)(float)n == n 对任何 int n 吗?至少对于非负的 31 位值我需要这个。

附录。 (int)(double)n ==n 呢?

最佳答案

不,你不能。对于不能用 float 精确表示的 int,这将失败。

(原因:float一般是一个32位的IEEE-754浮点值,只有24位精度,其余的留给指数和符号。所以如果你的整数比 23 有更多的有效二进制数字,并且它不是 2 的适当幂的倍数,那么它不能精确地表示为 float。)

addendum. What about (int)(double)n ==n?

是一样的。对于不能表示为 doubleint,比较不会总是产生 true。然而,一般来说,int 的长度不足以实现这一点——广泛接受的 double 实现是一个 64 位 IEEE-754 float ,它有 53位精度,而 int 往往最多 32 位长。但您始终可以尝试使用 longlong longdouble 来重复实验。

这是一个演示:

#include <stdio.h>

int main()
{
    int n = (1 << 24) + 1;

    printf("n == n: %d\n" , n == n);
    printf("n == (int)(float)n: %d\n", n == (int)(float)n);

    return 0;
}

这打印:

n == n: 1
n == (int)(float)n: 0

关于c - 浮点转换假设 : (int)(float)n == n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20900313/

相关文章:

c - 链表实现中的虚拟节点

带有效载荷的 C 双字面值 NaN

c# - 为什么 float.MaxValue 0xFF 0xFF 0x7F 0x7F 而不是 0x7F, 0xFF, 0xFF, 0xFF 之类的整数?

floating-point - 在仅支持 32 位 float 的平台上,如何将 IEEE754 64 位 double 除以 1000?

go - 如何以正确的方式将 float64 数字更改为 uint64?

c++ - 在 c/c++ 中编辑从 stdin 打印在 stdout 上的文本

c - Typedef Struct在C编程中的使用

C程序在windows下用cygwin编译成功,在linux下出现segmentation fault。 cygwin GCC 是 'bad' 吗?

c - C 中是否使用了 IEEE-754 表示法?

c - C中 float 的平方