浮点数的整数除以自身是否保证为1.f?


76

如果我写:

int x = /* any non-zero integer value */;
float y = x;
float z = y / y;

z保证是完全1.F?


7
即使按照C ++标准,也std::numeric_limits<int>::max()可能需要相当多的脚手架才能证明它可能比更大std::numeric_limits<float>::max()
MSalters

2
@MSalters哈哈,我考虑过要包括在内,但认为它太愚蠢了。:)
Baum mit Augen

1
@MSalters:FWIW,对于大多数xstatic_cast<int>(y) != x(如果两者均为32位),但z仍将等于,1.0f除非x == 0因为分母和分母都具有相同的舍入误差。
Arne Vogel

如果两个数字xy足够大,并且彼此足够接近(不相等),则由于转换错误,x/y也可能1.f太大。尝试在浏览器的控制台中输入这个(这可能也使用IEEE754),并敲回车:9223372036854775700/9223372036854775800
卡西奥·雷南

1
@ArneVogel:实际上,+ INF / + INF是NaN,而不是1.0
MSalters

Answers:


96

如果您的C ++实现使用IEEE754,则可以,这是可以保证的。(除法运算符必须返回最佳的浮点值)。

唯一例外y / y,在一般情况下,不是1.f都情况下,当yNaN+Inf-Inf0.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


2
我认为不会y成为NaN。
Baum mit Augen

2
如果要走这条路线,还需要添加Inf,-Inf和-0f。:)
Baum mit Augen

2
@BaummitAugen:有很多IEE754位模式,全部NaN,其中一些设置了符号位。但是NaN != NaN,对于NaN的任何位模式,争论“ + NaN == -NaN”是否毫无意义。
MSalters

1
假设y值既在寄存器中又在内存中,并且编译器选择从内存中加载分母。这样你就结束了y_from_register / y_from_memory。如果寄存器比存储器具有更高的精度,那么如何保证1是最佳除法结果呢?
David Schwartz

1
另一个例外是何时float不能包含x的值。
纳特

33

不,并非在所有情况下,即使对于IEEE754。

例如,使用int x = 0;,您将获得NaN。(直播


在您发布此内容之前,只是将其插入我的答案中即可。进行投票。
Bathsheba

我发现您的措词含糊不清且具有误导性,因此我建议进行修改以使其更清晰。

3
@cat我可以理解您建议的“并非在所有情况下”部分,但是您对“例如”的使用表明存在其他适用于相同值的值,因此,我个人认为答案就在这里现在比您建议的答案更好。

@hvd当y是inf0f或签署那些变体时,结果也不是1f
cat

3
@cat问题特别是关于一个整数浮点数除以本身,并float y = x;带有int x;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.