Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么将一个浮点变量与另一个类型转换为int的浮点变量相减会给出完全不同的答案?_C++ - Fatal编程技术网

C++ 为什么将一个浮点变量与另一个类型转换为int的浮点变量相减会给出完全不同的答案?

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)

以下代码显示-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) 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是愚蠢的,但是你知道)