Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C, C++ 및 Java의 부동 소수점 연산 및 연관성

<시간/>

C, C++ 및 Java에서는 부동 소수점 숫자로 몇 가지 수학 연산을 수행합니다. 이제 여기에서 부동 소수점 숫자가 결합 규칙을 따르는지 여부를 확인합니다.

내 대답은 아니오 야. 부동 소수점 숫자는 경우에 따라 연관성 규칙을 따르지 않습니다. 여기에서 몇 가지 예를 볼 것입니다.

예시 코드

#include<iostream>
using namespace std;
main() {
   float x = -500000000;
   float y = 500000000;
   float z = 1;
   cout << "x + (y + z) is: " << x + (y + z) << endl;
   cout << "(x + y) + z is "<< (x + y) + z << endl;
}

출력

x + (y + z) is: 0
(x + y) + z is 1

여기에서 결과가 동일하지 않다는 것을 알 수 있지만 이론적으로 항상 1이라고 말할 수 있습니다. 이제 이것이 어떻게 이루어지느냐는 질문이 나옵니다.

첫 번째 경우 x + (y + z), (500000000 + 1)이 수행됩니다. 그러나 부동 소수점 반올림의 경우 다시 500000000으로 변환됩니다. 이제 -500000000을 더하면 0이 됩니다. 두 번째 식에서 값은 (-500000000 + 500000000) =0이고 1을 더하여 최종 결과가 1이 되도록 합니다.

정수를 사용하면 두 표현식 모두 동일한 결과인 1을 반환합니다.