Ноль минус ноль эквивалентно бесконечности?

Я пишу метод, который создает копию массива массивов с плавающей точкой. После отладки я получил некоторые очень странные значения, поэтому я подумал, что могу спросить об этом, так как не смог понять это, прочитав часто задаваемые вопросы о массиве 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;
}
}
}

(В моих тестах высота = 32 и ширина = 256, но это не должно относиться к делу.) Когда я инициализирую testArray, все его значения должны быть 0.0, правильно? Затем в цикле я вычитаю 0.0 из определенного элемента в testArray, который логически не должен менять значение вообще. Но печать значений testArray в качестве шага отладки приводит к некоторым странным значениям, таким как следующий фрагмент:

[...]
0
[...]
-3.23805e-24
[...]
8.40779e-45
[...]
1.79513e+37
[...]
0
[...]
3.19586e+36
[...]

Наиболее тревожными значениями являются бесконечные, такие как четвертое число, указанное выше. Я, честно говоря, не знаю, почему это происходит. Разве все эти значения не должны быть примерно 0,0? Я думал, что это связано с неточностью арифметики с плавающей запятой, но это не должно приводить к бесконечному значению ….

5

Решение

Нет, когда вы объявите свой массив таким образом, он будет неинициализирован, поскольку это встроенный тип. Вам нужно будет инициализировать его до нуля перед выполнением вычитания.

Но обратите внимание, что объявление массива как у вас (с предположительно неконстантными измерениями) является расширением компилятора, а не частью языка.

Я бы просто использовал vector которая решает обе проблемы одновременно.

std::vector<std::vector<float> > testArray(height, std::vector<float>(width));
7

Другие решения

Попробуйте инициализировать значения в массиве:

float testArray[height][width] = {};
3

Эта линия создает неинициализированным массив, значения элемента могут быть любой фигней:

float testArray[height][width];

Чтобы инициализировать его значениями по умолчанию с плавающей точкой (ноль), используйте следующий синтаксис:

float testArray[height][width] = {};
2

ЭТО ОТВЕТ НЕПРАВИЛЬНО, НО Я БРОСАЮ, ЧТО ЭТО НИЧЕГО НЕ ПЫТАЕТСЯ!

Используйте это очень явное определение:

float testArray[height][width] = {{0.0f}};

чтобы гарантировать, что каждое значение в вашем массиве инициализируется в ноль. В противном случае значения в массиве будут неопределенными. Я чувствую, что это самое «читаемое» решение.

ПОЧЕМУ ЭТО НЕПРАВИЛЬНО?

Как упоминает @Dave ниже, хотя это решение работает для этого случая, оно вводит в заблуждение. Это явно назначает только первый элемент из testArray до 0.0, пока значение инициализирует все остальные элементы в массиве.

Правильное решение действительно:

float testArray[height][width] = {};

какое значение инициализирует все элементы в массиве (к значению по умолчанию 0.0f для типа float,

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector