(100.0/3.0)*3 == 100,但使用变量得到 99.99996。怎么回事?
(100.0/3.0)*3 == 100, but using variables yields 99.99996. What's the deal?
我知道浮点数固有的不精确性。我感到困惑的是,为什么我会从我期望解析0.99999999等的东西中返回"100"。0.33*3怎么可能产生100?
下面是我的代码:如果我输入float x = 100.0/3.0;
printf("%f",x*3.0);
输出为"99.999996"。但是如果我输入
printf("%f",(100.0/3)*3);
输出为"100"。它们不应该是相同的吗?我希望x
能够解析为(100.0/3.0),也就是明文形式写的内容——但是它们会产生两个不同的结果。
问题是您的第二个表达式不等于第一个表达式:它始终使用doubles
,而第一个表达式在除法后转换为float
,迫使中间结果降低精度。
要构建一个完全等价的表达式,在除法后对float
进行强制转换,如下所示:
printf("%f", ((float)(100.0/3.0))*3.0);
// ^^^^^
这会产生与第一个示例相同的输出,即"99.999996
(demo)
如果在第一个示例中使用double
代替x
,那么也会得到输出100.000000
:
double x = 100.0/3.0;
printf("%f",x*3.0);
(另一个演示)。
相关文章:
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 绕道重铸瓷砖层是怎么回事
- 架 (U+67B6) 与en_US不符.UTF-8.这是怎么回事?
- R 中的算术在数字上比整数更快。这是怎么回事?
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 弄清楚这段代码是怎么回事(递归下降案例研究)
- 分配器密集和稀疏是怎么回事?
- 传递引用C++,指针的向量.这是怎么回事?
- __vector_base_common是怎么回事?
- (对象)不命名类型.怎么回事
- 变量已在 .obj 中定义;这是怎么回事?
- Sublime上的EasyClangComplete是怎么回事?
- 重复输出的类型是怎么回事,它如何区分迭代次数和 Ascii 代码?
- 标准::地图使用.这是怎么回事?核心转储?我做得不正确?
- llvm libcxx的源代码是怎么回事?
- 这一行是怎么回事: istringstream is( line );
- (100.0/3.0)*3 == 100,但使用变量得到 99.99996。怎么回事?