零减零相当于无穷大?

Tak*_*keS 5 c++ arrays floating-point multidimensional-array

我正在编写一个方法来创建一个浮点数组的副本.在调试之后,我得到了一些非常奇怪的值,所以我想我会问这个,因为我无法通过阅读C++数组常见问题解答这一点.

这是代码的相关部分(它是一个庞大的程序的一部分,大部分内容与这篇文章无关):

// height and width are integer global variables
void method () {
    float testArray[height][width];
    for(int j = 0; j < height; ++j) {
        for(int i = 0; i < width; ++i) {
            testArray[j][i] -= 0.0;
            std::cout << testArray[j][i] << std::endl;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(在我的测试中,height = 32和width = 256,但这不应该是相关的.)当我初始化testArray时,它的值应该都是0.0,对吗?然后,在循环中,我从testArray中的某个元素中减去0.0,这在逻辑上根本不会改变该值.但是将testArray的值打印为调试步骤会产生一些奇怪的值,例如以下代码段:

[...]
0
[...]
-3.23805e-24
[...]
8.40779e-45
[...]
1.79513e+37
[...]
0
[...]
3.19586e+36
[...]
Run Code Online (Sandbox Code Playgroud)

最令人担忧的值是无限值,例如上面列出的第四个数字.老实说,我不知道为什么会这样.不是所有这些值都不应该大约为0.0吗?我认为这与浮点运算的不精确有关,但这不应该导致无限值....

Mar*_*k B 7

不,当你声明你的数组时,它将是未初始化的,因为它是内置类型.在进行减法之前,您需要将其初始化为零.

但请注意,声明一个数组(可能是非const维度)是编译器扩展而不是语言的一部分.

我会用vector它来解决这两个问题.

std::vector<std::vector<float> > testArray(height, std::vector<float>(width));
Run Code Online (Sandbox Code Playgroud)