Arrays 在非精确浮点运算中乘法总是可交换的吗?

Arrays 在非精确浮点运算中乘法总是可交换的吗?,arrays,floating-point,operator-overloading,d,Arrays,Floating Point,Operator Overloading,D,我试图理解D语言运行时中的一些代码。似乎以下两个方面有单独的功能: array1[] += scalar * array2[]; array1[] += array2[] * scalar; 为什么不能用一个函数完成这些操作?我认为即使在不精确的浮点运算中,乘法也是可交换的。我想区别只是在函数原型中——一个是(double,double[]),另一个是(double[],double)。但是结果应该是一样的。我对D语言一无所知,但我很乐意回答你标题中的问题: 在非精确浮点运算中乘法总是可交换的

我试图理解D语言运行时中的一些代码。似乎以下两个方面有单独的功能:

array1[] += scalar * array2[];
array1[] += array2[] * scalar;

为什么不能用一个函数完成这些操作?我认为即使在不精确的浮点运算中,乘法也是可交换的。

我想区别只是在函数原型中——一个是
(double,double[])
,另一个是
(double[],double)
。但是结果应该是一样的。

我对D语言一无所知,但我很乐意回答你标题中的问题:

在非精确浮点运算中乘法总是可交换的吗


达到NaN值的“有效载荷”,是。IEEE-754浮点乘法是可交换的(加法也是如此)。如果您不知道NaN的有效负载是什么,请不要担心。

但是dong array1[]+=scalar*array2[];由编译器作为函数调用重写。这些数组操作有特殊的语法。不能使用函数调用语法直接调用函数。为什么编译器不能只使用一个函数,并以与array1[]+=array2[]*标量相同的方式重写它?编译器如何知道是调用
array::operator*(标量)
还是
int::operator*(数组)
?换句话说,您需要区分
array1[]+=scalar/array2[]
array1[]+=array2[]/scalar
。因此,运算符重载规则必须要求定义这两个变量。在
*
+
的情况下,结果是相同的,但调用约定仍然不同。当然,对于
-
/
,结果也不同。但是数组是内置在D中的。这是编译器内部函数,而不是运算符重载。此外,即使使用运算符重载,您也只需要一个函数调用另一个函数。您不会有两个实现。将标量升级为数组实际上没有意义,因此我仍然认为您需要两个版本,以便调用方能够正确地传递数组和标量。但是一个调用另一个当然是有意义的。即使你不关心NaN的有效负载,你仍然可能关心编译器不能围绕这个进行优化…@R..:754标准实际上对NaN的有效负载没有任何要求(有一些应该子句,但没有shall),C99也没有。编译器要围绕这个问题进行优化所需要做的就是不再进一步限制行为。