1 / f * f
在数学上应等于1
。我用下面的代码测试了这个身份,对于f = 41.000000和f = 47.000000来说不是真的。
我认为这与浮点或舍入有关,但不知道原因。 是什么导致这个结果?
#include <stdio.h>
int main(void) {
float f;
for (f = 1; f < 50; f += 1) {
if (1 / f * f != 1)
printf("f=%f\n", f);
}
return 0;
}
答案 0 :(得分:2)
它确实与浮点舍入有关。如果您使用实数运算,则对于非零f
,1/f * f == 1
始终为true。在浮点运算中,通常但并非总是如此。
以41.0为例,1/f
的实际算术值为0.024390243902439024390243902439 ....除法的四舍五入结果为0.024390242993893834534521484375,这比实际算术结果小得多的乘积小于1。
浮点算术被设计为与实际算术非常接近,同时还允许高效实现。在很多情况下,即使不是全部,它都能实现实数不变也就不足为奇了。