我想了解D語言運行庫中的一些代碼。似乎有以下兩件事分開的功能:乘法在不精確的浮點算術中總是可交換的嗎?
array1[] += scalar * array2[];
array1[] += array2[] * scalar;
爲什麼不能用一個函數來完成?我認爲即使在不精確的浮點運算中乘法也是可交換的。
我想了解D語言運行庫中的一些代碼。似乎有以下兩件事分開的功能:乘法在不精確的浮點算術中總是可交換的嗎?
array1[] += scalar * array2[];
array1[] += array2[] * scalar;
爲什麼不能用一個函數來完成?我認爲即使在不精確的浮點運算中乘法也是可交換的。
我一無所知d的語言,但我會高興地回答這個問題在您的標題:
是乘法交換總是在不精確浮點運算?
直到NaN值的「有效載荷」,是的。 IEEE-754浮點乘法是可交換的(所以是加法)。如果您不知道NaN的有效載荷是什麼,請不要擔心。
我想區別只是在功能原型 - 一個是(double, double[])
和另一個是(double[], double)
。但結果應該是一樣的。
但是dong array1 [] + = scalar * array2 [];由編譯器重寫爲函數調用。這些數組操作有特殊的語法。您不要直接使用函數調用語法來調用函數。爲什麼編譯器不會只有一個函數,並以與array1 [] + = array2 [] *標量相同的方式重寫? – dsimcha 2011-02-15 22:44:36
編譯器如何知道是否要調用`array :: operator *(標量)`或`int :: operator *(array)`?換句話說,你需要區分`array1 [] + =標量/數組2 []`和`數組1 [] + =數組2 [] /標量`。所以操作符重載規則必須要求定義這兩個變體。在`*`和`+`的情況下,結果是一樣的,但調用約定仍然不同。當然,`-`和`/`的結果也不一樣。 – mtrw 2011-02-16 02:22:28