如果我写:
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
或-Inf
1。撇开最后一点,在您的情况下,这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()
。