2

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

附录。怎么样(int)(double)n ==n

4

1 回答 1

10

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

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

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

一样的。对于int不能表示为 a 的 s,double比较不会总是产生真值。然而,一般来说,int不足以实现这一点——被广泛接受的实现double是一个 64 位 IEEE-754 浮点数,它具有 53 位精度,而ints 往往最多 32 位长。但是你总是可以尝试用 along或 along long和 a来重复实验double

这是一个演示:

#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
于 2014-01-03T09:24:33.200 回答