부동 소수점 연산: 부동 소수점 연산의 연관성 탐색
프로그래밍 영역에서 부동 소수점 숫자는 작업에 필수적입니다. 연속적인 값으로. 그러나 부동 소수점 산술은 때로 학교에서 배운 수학과 다르게 동작할 수 있으며, 특히 결합성에 있어서는 더욱 그렇습니다.
세 개의 부동 소수점 값을 추가하고 이를 1과 비교하는 예를 생각해 보세요.
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // output is 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // output is 1
신기하게도 두 표현은 서로 다른 결과를 낳습니다. 이러한 불일치는 부동 소수점 덧셈이 항상 결합적인 것은 아니라는 사실에서 비롯됩니다. 즉, 값을 추가하는 순서를 바꾸면 최종 결과가 바뀔 수 있습니다.
비연관성 현상은 부동 소수점 표현의 한계로 인해 발생합니다. 부동 소수점 숫자는 비트 수가 한정된 이진 형식을 사용하므로 정확도가 제한됩니다. 결과적으로 부동 소수점 숫자를 사용한 계산에서는 여러 연산에 걸쳐 누적되는 반올림 오류가 발생할 수 있습니다.
위의 예에서 0.7, 0.2, 0.1을 더하면 순서에 따라 중간 값이 약간씩 달라집니다. 운영. 이러한 약간의 차이는 후속 추가를 통해 전파되어 궁극적으로 다른 최종 결과로 이어집니다.
이 개념을 더 이해하기 위해 David Goldberg의 세미나 논문 "What Every Computer Scientist Should Know about Floating Point Arithmetic"의 예를 고려해 보겠습니다.
(1e30 + -1e30) + 1 = 1, while 1e30 + (-1e30 + 1) = 0
이 경우 괄호가 결과에 큰 영향을 미칩니다. 괄호 안에 1e30과 -1e30을 더하면 반올림으로 인해 0에 가까운 값이 되고, 그 결과 1이 더해집니다. 반면에 1e30을 더하고 -1e30 1의 결과는 0이 아닌 값이 됩니다.
따라서 부동 소수점 연산을 사용할 때는 잠재적인 비결합성을 인식하고 다음과 같은 표현식을 조작할 때 주의하는 것이 중요합니다. 반복되는 추가 또는 기타 연관 연산.
위 내용은 부동 소수점 덧셈이 항상 결합 법칙을 따르지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!