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;
}
最佳答案
确实与浮点舍入有关。如果您从事实数算术,对于非零 f
,1/f * f == 1
始终为真。在浮点算术中,通常但并不总是如此。
以41.0为例,1/f
的实际算术值为0.024390243902439024390243902439....除法的舍入到浮点结果为0.024390242993831634521484375,这比实际值足够小算术结果:乘法结果小于1。
浮点算术被设计为非常接近真实算术,同时也允许高效的实现。毫不奇怪,它在许多情况下实现了实数不变量,只是不是全部。
关于c - 关于 float 和舍入的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58461093/