시간 배열이 필요한 ODE-solver를 프로그래밍 할 때 다음과 같은 이상한 동작이 발생했습니다. 다음 코드는 문제를 명확하게 재현해야합니다.<= 및 == 연산자가 제대로 작동하지 않음
0 0.01 0.02 0.03 0.04 ... 0.97 0.98 0.99
t = 1 and t <= 1.00? 0
c = 1 and c <= 1.00? 1
t == 1.00? 0 and c == 1.00? 1
내 질문은 :
#include <iostream>
using namespace std;
int main() {
double t = 0.0;
for (t = 0.0; t <= 1.00; t += 0.01) {
cout << t << " ";
}
cout << endl;
cout << "t = "<< t << " and t <= 1.00? " << (t <= 1.00) << endl;
double c = 1.00;
cout << "c = "<< c << " and c <= 1.00? " << (c <= 1.00) << endl;
cout << "t == 1.00? " << (t == 1.00) << " and c == 1.00? " << (c == 1.00) << endl;
return 0;
}
이
다음과 같은 출력을 제공 t 명확 1과 동일해야하고 동안 (t < = 1.00)와 (t의 == 1.00)가 false를 돌려 않는 이유 t는 double 유형입니까?정말
사전에 감사 ... 내 t 단계는 하드 등으로 구분되지 않은 내 진짜 코드에서이 문제의 원인을 피할 수 없습니다.편집 : 답변 해 주셔서 감사합니다. 실제로 0.01 등의 이진 표현의 문제는 정확하지 않지만 특정 반올림 오류가 있습니다. t scale은 프로그램의 다른 물리량에 의해 실제로 강제되었습니다. 그 동안 다른 곳에서 얻은 또 다른 답변/힌트는 부동 소수점 멤버로 작업 할 때 항상 허용 오차로 작업하는 것이 었습니다. 이 경우에 "t < = 1.00"은 응용 프로그램에서 필요로하는 가변 정밀도 h로 작업 할 때 "t < 1.00 + 0.01/2"또는보다 일반적인 "t < 1.00 + h/2"가 될 수 있습니다.
: 거짓 항복하기로했다. 루프가 사실이라면 루프가 멈추지 않습니다. ('c <= 1.00'에 해당하는 것은'c! = t' 때문입니다.) – user2357112
@ user2357112 예. 방금 내 어리 석음을 깨달았습니다. 따라서 플로트가 멋지게 잘 돌아 가지 않는다는 것을 고려했을 때 예상했던 것과 똑같습니다. – user463035818
'main'의 맨 처음에'cout.precision (17);'을 추가하면 문제가 명백해질 것입니다 (또는 좀 더 적절한 질문을 제기하십시오).). 누적 오류를 반올림하는 소수 자릿수 만 표시합니다. –