어떤 경우에는 값이 제대로 나오고 어떤 경우에는 부동소수점 오차 때문에 값이 제대로 안 나와서 확인해보는데
분명 피연산되는 값은 두 프로세스 모두 동일한데 좌측과 우측이 연산 결과가 다름 ㅡㅡ;;;;;;;;;;;;;;;;;;;;;;
위 스크린샷에 나오다 싶이 FMUL 의 피 연산자는 동일한 값임
ST0 : 54000.0000000000000
0x603770: 0.01 (0x3C23D70A)
그런데 실행 결과는 둘이 다름;;;
좌측은 540.00000 나오고 우측은 539.99998 이 나옴;;
우측에서 값이 이상하게 나와서 저 상태로 int 로 캐스팅해서 539 가 결과로 나오는데
나는 동일한 ST0 값과 메모리에 있는 값으로 FMUL 을 했는데 다른 결과가 나온다는 게 이해가 안 됨;;
왜 이러는지 아는 사람 있으면 설명 좀 부탁해 ㅇㅅㅇ;;;;
소수연산은 원래그럼 10의 n승 곱하고 다시 나눠
부동소수점의 특징임. 32비트라 더욱 부정확함. 차라리 double 형을 써
동문서답이잖음 본문 내용은 동일한 피연산자로 cpu 가 FMUL 명령어 실행하고 결과가 다른 거임
부동소수점이 왜 정밀도라는 이야기를 하는지 생각하시면 왜이러는지 이해가 가실겁니당
동문서답임 st0 이랑 메모리에 있는 값 두 프로세스가 정확히 일치하고 cpu가 FMUL 어셈 실행했을 때 결과가 다르단 건데 정밀도 얘기가 왜 나옴
https://docs.microsoft.com/ko-kr/cpp/build/reference/fp-specify-floating-point-behavior?view=msvc-170
난 이게 연관이 있다고 생각
내가 본문을 잘못 썻네 컴파일된 코드는 동일한 두 프로세스가 결과가 다른 거임 ㅠㅠ
해결 완료) 어디서 fcw 를 값을 single-precision 이 아니라 double-precision 으로 설정해서 값이 다르게 나오는 거였음
이거 남들에게 도움이 될만 할 거 같은데 프갤에 좀만 자세히 써줄수 있을까
일단 함수는 입력값이 같으면 출력값도 항상 같기 때문에 명령어 문제가 아니라는 것을 확신했고 그렇다면 외부적으로 연산 결과에 영향을 끼치는 상태 레지스터 값이나 비슷한 종류가 존재한다고 볼수밖에 없겠지...