В нормальном приложении Windows на 32 бита процесс только имеет 2 ГБ адресуемой памяти. Это не важно на сумму физической памяти, которая доступна.
Так доступные 2 ГБ, но 1.5 макс., которое можно выделить. Ключ - то, что Ваш код не является единственным кодом, работающим в процессе. Другие.5 ГБ являются, вероятно, CLR плюс фрагментация в процессе.
Обновление: в.Net 4.5 в процессе на 64 бита у Вас могут быть большие массивы, если установка gcAllowVeryLargeObjects включена:
На 64-разрядных платформах, включает массивы, которые больше, чем 2 гигабайта (ГБ) в общем размере. Максимальное число элементов в массиве является UInt32. MaxValue.
Использование C ++ слова «норма» довольно сбивает с толку, поскольку большинство людей когда-либо сталкивались с нормами только в контексте векторных пространств. Если вы рассматриваете комплексные числа как векторное пространство над вещественными числами, это определенно не норма. Честно говоря, функция std :: norm () вычисляет так называемую Норму поля из комплексных чисел в вещественные числа.
К счастью, есть функция std :: abs () , который делает то, что вы хотите.
Кстати, евклидова норма в квадрате может быть полезна в качестве оптимизации, особенно в игровой физике; если вы хотите сравнить величины/расстояния, или по какой-либо другой причине вам не нужна линейность, то вы можете работать с квадратами расстояний, а не с фактическими расстояниями, и избегать вычисления квадратных корней.
norm(v1) < norm(v2) instead of abs(v1) < abs(v2)
norm(v) < CONSTANT_SQUARED instead of abs(v) < CONSTANT
(используя тот факт, что abs() является величиной, как упоминалось в другом ответе)