如果我写:
int x = /* any non-zero integer value */;
float y = x;
float z = y / y;
为z保证是完全1.F?
如果我写:
int x = /* any non-zero integer value */;
float y = x;
float z = y / y;
为z保证是完全1.F?
x,static_cast<int>(y) != x(如果两者均为32位),但z仍将等于,1.0f除非x == 0因为分母和分母都具有相同的舍入误差。
x和y足够大,并且彼此足够接近(不相等),则由于转换错误,x/y也可能1.f太大。尝试在浏览器的控制台中输入这个(这可能也使用IEEE754),并敲回车:9223372036854775700/9223372036854775800。
Answers:
如果您的C ++实现使用IEEE754,则可以,这是可以保证的。(除法运算符必须返回最佳的浮点值)。
该唯一例外y / y,在一般情况下,不是1.f都情况下,当y被NaN,+Inf,-Inf,0.f,和-0.f,或者如果你是在一个平台上,其中 int是如此广泛,它的某些情况下不能在表示float没有这种float设定为+Inf或-Inf1。撇开最后一点,在您的情况下,这int x = 0;将产生唯一的例外。
IEEE754非常普遍。但是要确定,请测试
std::numeric_limits<float>::is_iec559;
1例如,对于的某些值,具有128位int和IEEE754 32位的平台float将表现出这种行为x。
y成为NaN。
NaN,其中一些设置了符号位。但是NaN != NaN,对于NaN的任何位模式,争论“ + NaN == -NaN”是否毫无意义。
y值既在寄存器中又在内存中,并且编译器选择从内存中加载分母。这样你就结束了y_from_register / y_from_memory。如果寄存器比存储器具有更高的精度,那么如何保证1是最佳除法结果呢?
float不能包含x的值。
std::numeric_limits<int>::max()可能需要相当多的脚手架才能证明它可能比更大std::numeric_limits<float>::max()。