C++ 浮点运算中的意外行为

问题描述 投票:0回答:1

所以,我写了一些代码:

#include <iostream>
#include <cmath>

int main() {

    int a,b,n;
    std::cin >> a >> b >> n;
    double xi[n];
    double yi[n];
    double h = (b - a + 0.0) / n + 0.0;
    
    for (int i = 0; i <= n; ++i) { //filling the arrays
        xi[i] = a + (h*i);
        yi[i] = xi[i]*xi[i]*std::acos(0.9*xi[i]); //the 
    }
    for (int i = 0; i <= 5; ++i)  { //displaying first 5 elements of the arrays
        std::cout << "x" << i << ": " << xi[i] << "\n";
        std::cout << "y" << i << ": " << yi[i] << "\n\n";
    }
    return 0;
}

如果您尝试使用 a = 0、b = 1 和 n = 10 运行它(后来我发现任何能被 10 整除的数字都会给出类似的结果),那么您将看到 x0 = 0.451027,而不是 x0 = 0。

我尝试强制将其假定值分配给 xi[0]

if (i == 0) {
    xi[i] = a;
}

现在x0仍然等于这个0.451027废话,但如果在第一种情况下y0的值是正确的(0),强制分配它是9.2684e-315,如果你认为这几乎是正确的,但仍然不是0。 static_cast对于解开这个谜团也束手无策。

这感觉很超现实,但它却在一次又一次的跑步中发生。可以修复吗?

c++ floating-point
1个回答
0
投票

数组边界:你的循环

for (int i = 0; i <= n; ++i)
会给你带来各种麻烦,因为你访问的 xi 和 yi 越界。 C++ 中的数组是零索引的,因此您应该从 0 循环到 n-1。像这样:
for (int i = 0; i < n; ++i)

这解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.