2011-02-15 10 views
2

D 언어 런타임에서 일부 코드를 이해하려고합니다. 다음 두 가지 기능에 대한 별도의 기능이있는 것처럼 보입니다.부정확 한 부동 소수점 연산에서 곱셈은 항상 교환 가능합니까?

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

왜 이러한 기능을 하나의 기능으로 수행 할 수 없습니까? 곱셈은 ​​정확하지 않은 부동 소수점 연산에서도 교환 가능하다고 생각했습니다.

답변

1

본인은 D 언어에 대해 아무것도 몰라,하지만 난 행복 제목에 질문을 답변 해 드리겠습니다 :

곱셈은 부정확 한 부동 소수점 연산에서 항상 교환 법칙이 성립인가?

"payload"의 NaN 값까지, 예. IEEE-754 부동 소수점 곱셈은 교환 가능합니다 (또한 덧셈도 가능합니다). NaN의 페이로드를 모르는 경우에는 걱정하지 마십시오.

+0

NaN 페이로드에 신경 쓰지 않는다해도 컴파일러가이 문제를 해결할 수 없다는 사실을 계속 염려 할 것입니다. –

+1

@R .. : 754 표준은 NaN의 페이로드에 대한 요구 사항이 없습니다 (어떤 절이 있어야하지만, shall은 없다) C99도 그렇지 않다. 이 문제를 해결하기 위해 컴파일러가해야하는 일은 더 이상 동작을 더 이상 고정하지 않는 것입니다. –

5

차이점은 함수 프로토 타입에있는 것 같습니다. 하나는 (double, double[])이고 다른 하나는 (double[], double)입니다. 그러나 그 결과는 어느 쪽과도 같아야합니다.

+0

그러나 dong array1 [] + = 스칼라 * array2 []; 컴파일러에 의해 함수 호출로 다시 작성됩니다. 이러한 배열 작업에는 특별한 구문이 있습니다. 함수 호출 구문을 사용하여 함수를 직접 호출하지 마십시오. 왜 컴파일러는 하나의 함수 만 가지고 array1 [] + = array2 [] * scalar와 같은 방식으로 다시 작성하지 않겠습니까? – dsimcha

+0

컴파일러는'array :: operator * (scalar)'또는'int :: operator * (array)'호출 여부를 어떻게 알 수 있습니까? 다른 방법으로는, array1 [] + scalar/array2 []와 array1 [] + = array2 []/scalar'를 구별 할 필요가 있습니다. 따라서 연산자 오버로딩 규칙은 두 변종을 모두 정의해야합니다. '*'와'+'의 경우 결과는 같지만 호출 규칙은 여전히 ​​다릅니다. 물론'-'와'/'에 대해서도 결과가 다릅니다. – mtrw

+0

그러나 배열은 D에 내장되어 있습니다. 이것은 연산자 오버로드가 아닌 컴파일러 내장 함수입니다. 또한 연산자 오버로딩을 사용하는 경우에도 한 함수에서 다른 함수를 호출 할 수 있습니다. 두 가지 구현이 없을 것입니다. – dsimcha