Gre*_*gle -3 c++ floating-point
我知道浮子固有的不精确.我感到困惑的是为什么我会从我期望解决的问题返回"100"0.99999999等.0.33*3怎么可能产生100?
这是我的代码:如果我说
float x = 100.0/3.0;
printf("%f",x*3.0);
Run Code Online (Sandbox Code Playgroud)
输出为"99.999996".但如果我说
printf("%f",(100.0/3)*3);
Run Code Online (Sandbox Code Playgroud)
输出为"100".它们不应该相同吗?我希望x解决(100.0/3.0),正是用明文写的 - 然而它们会产生两种不同的结果.
问题是你的第二个表达式不等于第一个表达式:它doubles在整个过程中使用,而第一个表达式float在除法之后进行转换,迫使中间结果降低精度.
要构建完全等效的表达式,请float在分割后添加强制转换,如下所示:
printf("%f", ((float)(100.0/3.0))*3.0);
// ^^^^^
Run Code Online (Sandbox Code Playgroud)
这产生与第一个例子相同的输出,即"99.999996(演示)
如果你在第一个例子中使用doublefor x,你也得到了输出100.000000:
double x = 100.0/3.0;
printf("%f",x*3.0);
Run Code Online (Sandbox Code Playgroud)
(另一个演示).