零减去零等于无穷大
Zero minus zero equivalent to infinity?
我正在编写一个方法,该方法创建浮点数组的副本。调试后,我得到了一些非常奇怪的值,所以我想我应该问一下这个问题,因为我无法通过阅读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;
}
}
}
(在我的测试中,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
[...]
最令人担忧的值是无穷大的值,例如上面列出的第四个数字。老实说,我不知道为什么会发生这种事。难道所有这些值都不应该是0.0左右吗?我认为这与浮点运算的不精确有关,但这不应该导致无穷大的值。。。。
否,当您这样声明数组时,它将被取消初始化,因为它是一个内置类型。在做减法之前,您需要自己将其初始化为零。
但请注意,声明现有的数组(可能具有非常量维度)是编译器扩展,而不是语言的一部分。
我只想使用vector
,它可以同时解决这两个问题。
std::vector<std::vector<float> > testArray(height, std::vector<float>(width));
尝试初始化数组中的值:
float testArray[height][width] = {};
此行创建一个未初始化的数组,元素值可以是任何垃圾:
float testArray[height][width];
要用浮点默认值(零)初始化它,请使用以下语法:
float testArray[height][width] = {};
这个答案是错误的,但我要离开,所以没有人尝试
使用这个非常明确的定义:
float testArray[height][width] = {{0.0f}};
以确保数组中的每个值都初始化为零。否则,数组中的值将是未定义的。我觉得这是最"可读"的解决方案。
为什么会出错
正如@Dave在下面提到的,尽管这个解决方案适用于这种情况,但它具有误导性。它只显式地将testArray
的第一个元素赋值为0.0,而它的值初始化数组中的所有其他元素。
正确的解决方案确实是:
float testArray[height][width] = {};
该值初始化数组中的所有元素(对于类型float
为默认值0.0f
。
- 无穷大而循环时具有递归函数
- 在C++中比较无穷大和无穷大
- Rand()大小写开关在多次迭代后运行到无穷大
- 无穷大与 NAN 值
- Android Studio 调试原生代码 lldb 服务器工作无穷大
- Matlab 如何知道有一个 .mex64 文件并避免无穷大"compiling"循环
- 比较无穷大
- 为什么双重类型返回无穷大
- 如何获得从负无穷大到无穷大的范围以在 0 到 1 的范围内表示
- c++ std 的 inf 的行为是否与常识无穷大完全一样
- 无穷大不是constexpr
- 零减去零等于无穷大
- 浮点变量变为无穷大
- 如何避免无穷大递归中的堆栈溢出
- 为什么math.h的pow函数返回无穷大的值
- 是0除以无穷大,保证为0
- 在物理计算中表示无穷大
- 错误:“无穷大”未命名类型
- 在C++中检查二重是否等于负无穷大的最佳方法
- 使用快速排序对可能包含无穷大的容器进行排序安全吗