C++ 为什么C++;将范数定义为欧几里德范数的平方?

C++ 为什么C++;将范数定义为欧几里德范数的平方?,c++,math,C++,Math,这听起来可能有点像一个反问句,但我在这里问这个问题有两个原因: 我花了一段时间才知道C++ STD::()(和)的方式不同,所以其他人可能在这里遇到错误。 我发现将norm()函数定义为与通常认为的范数(或L2范数,或欧几里德范数等)不同(尽管密切相关)的东西很奇怪 < >特别是C++标准库定义复数的()为模(或绝对值)的平方,当复数为a+i*b/< >时,模数为平方乘(a^ 2+b^ 2)。 这违背了我对范数的理解,当被指定为欧几里德范数(对应于这里使用的模)时,它是平方和的平方根。我会参考的

这听起来可能有点像一个反问句,但我在这里问这个问题有两个原因:

我花了一段时间才知道C++ STD::()(和)的方式不同,所以其他人可能在这里遇到错误。
  • 我发现将
    norm()
    函数定义为与通常认为的范数(或L2范数,或欧几里德范数等)不同(尽管密切相关)的东西很奇怪
  • < >特别是C++标准库定义复数的<代码>()<代码>为模(或绝对值)的平方,当复数为a+i*b/< >时,模数为平方乘(a^ 2+b^ 2)。 这违背了我对范数的理解,当被指定为欧几里德范数(对应于这里使用的模)时,它是平方和的平方根。我会参考的

    这是别人碰到的吗?我发现它是从八度到C++的一些信号处理代码的结果,而我发现的唯一的地方是GCC邮件列表。

    < P>“规范”这个词的C++用法是相当混乱的,因为大多数人在向量空间的上下文中只遇到过规范。如果你把复数看作实空间上的向量空间,这绝对不是一个范数。在C++中,STD::(函数)确实计算所谓的从复数到Reals.
    幸运的是,还有std::abs()函数,它可以满足您的需要。

    顺便说一句,欧几里德范数平方可以用作优化,特别是在游戏物理中;如果要比较震级/距离,或出于任何其他原因不需要线性,则可以使用平方距离而不是实际距离,并避免计算平方根

    norm(v1) < norm(v2)         instead of   abs(v1) < abs(v2)
    norm(v) < CONSTANT_SQUARED  instead of   abs(v) < CONSTANT
    
    norm(v1)

    (使用另一个答案中提到的abs()是数量级的事实)

    在这里讨论GCC邮件列表:啊,我不知道字段规范-这当然有道理,或者至少提供了一个合理的解释,说明他们为什么选择定义norm()这样。可能只是巧合。我记得Mathworld说过,当谈论复数或类似复数的数字时,“norm”的用法是模棱两可的。字段范数具有以下优点,如Kevin Reid所指出的,并且它在数字字段中是封闭的事实-“整数复合体”的C++范数是整数,因此可以用整数整数OPS进行优化。