Im 부동 소수점 산술로 인해 일부 문제가 발생했습니다. 저는 모든 입력 변수가 다음 중요한 변수의 약 20 배에 달하는 가중치 공식을 기반으로 점수를 계산하려고합니다. 그러나 입력은 실수이므로 결과를 저장하기 위해 double을 사용하게되었습니다. 아래 코드는 E1과 E2의 차이를 잃어 버리는 문제가 있습니다.C++에서 부동 소수점 연산의 반올림 문제를 해결하는 방법은 무엇입니까?
이 코드는 성능에 민감하므로이 문제에 대한 효율적인 대답을 찾아야합니다. 나는 입력을 수백 배로 늘린 다음 int를 사용하여 생각했다. (생각하면 충분히 정확할 것이다.) 그러나 이것이 최상의 해결책이라는 것을 의문시한다.
#include <iostream>
int main()
{
double score1, score2;
float a = 2.75 ;
float b = 5.25 ;
float c = 5.25 ;
float d = 2.75 ;
float E1 = 3 ;
float E2 = 6 ;
score1 = 20 * b - 1 * a + 0.05 * d /* - 0.0025 * c*/ + 0.0001 * E1 ;
score2 = 20 * b - 1 * a + 0.05 * d /* - 0.0025 * c*/ + 0.0001 * E2 ;
std::cout << score1 << std::endl;
std::cout << score2 << std::endl;
std::cin.get();
return 0;
}
//ouputs:
//102.388
//102.388
부동 소수점이 제한되어, 그것에 대해 많은 정보가있다. – Drakosha
두 번 사용할 수 있습니다. 아주 특정한 상황에 있지 않는 한 저장 공간과는 별도로 플로팅을 제한하는 데에는 제한된 유틸리티가 있습니다. –