C++ 为什么将一个浮点变量与另一个类型转换为int的浮点变量相减会给出完全不同的答案?
以下代码显示-2.38419e-07,而不是0。但是,将int(arr[i])替换为(arr[i]/1时,它会显示正确的输出。为什么?C++ 为什么将一个浮点变量与另一个类型转换为int的浮点变量相减会给出完全不同的答案?,c++,C++,以下代码显示-2.38419e-07,而不是0。但是,将int(arr[i])替换为(arr[i]/1时,它会显示正确的输出。为什么? #include <bits/stdc++.h> using namespace std; int main() { float arr[4] = {4.58413, 1.22491, -2.10517, -3.70387}; float fsum = 0.00000; for(int i=0; i<4; ++i)
#include <bits/stdc++.h>
using namespace std;
int main() {
float arr[4] = {4.58413, 1.22491, -2.10517, -3.70387};
float fsum = 0.00000;
for(int i=0; i<4; ++i) fsum += (arr[i]-int(arr[i]));
cout << fsum << endl;
return 0;
}
#包括
使用名称空间std;
int main(){
浮动arr[4]={4.58413,1.22491,-2.10517,-3.70387};
浮动fsum=0.00000;
对于(int i=0;i断开的代码
你几乎是零,所以你有一个取整问题
只有你才能决定如何解决这个问题。你可以这么说
最终,在对浮点值进行类似的数学运算时,总会出现某种舍入误差。如果可以的话,尽量坚持使用定点
工作守则
其实这个也坏了
arr[i]/1
与arr[i]
(它不强制转换为int
),所以您所做的就是arr[i]-arr[i]
这将永远是零,即使你不希望它是
记住用不止一个测试用例来验证代码。测试一系列输入和输出
以下代码显示-2.38419e-07…为什么
(假设您的系统使用IEEE-754二进制32浮点)碰巧的是,这些浮点文字在您的系统上都无法精确表示。您并不是在将您编写的数字相加。您是在将这些数字相加,这些数字是可表示的,并且非常接近您的文字,但不完全是:
4.584129810333251953125
1.2249100208282470703125
-2.1051700115203857421875
-3.7038700580596923828125
简言之:并非所有数字都可以用有限浮点表示法表示,如果您的输入值不能准确表示,那么您的浮点计算中会出现精度错误。还有其他导致浮点精度错误的原因,这些原因在这里不一定适用
但是,在将int(arr[i])替换为(arr[i]/1时,会显示[output 0]。为什么
因为arr[i]/1
与arr[i]
和arr[i]-arr[i]
是0
和0+0+0
是0
如果你计算其他的东西,那么结果是其他东西就不足为奇了。推荐阅读:@molbdnilo所有分数部分的总和是零。理论上是。Ish。(Lightness和msalter当然是指源代码文字描述的十进制数,它们与float
值不同。)@L.F.是的(但老实说,这没有那么邪恶!)@因为他们把它从int(arr[i])
改成了int(arr[i])
。我可以看出这是从哪里来的(也就是说,在缺乏基础研究的情况下),因为我们在RHS上粘贴了1.0
,以强制进行浮点除法(好吧,我们没有,因为除以1是愚蠢的,但是你知道)