long double double로 static_casting하면 gcc와 gdb가 이상하게 작동하는 문제를 조사하고 있습니다. 다음과 같은 코드가 있습니다 :gdb의 C++ static_cast가 gcc와 다른 결과를 반환합니다.
기본적으로 3/60이므로 결과는 0.05가되어야합니다. 단순한 double
값으로 작업 할 때 xStep
의 값은 0.050000000000000003
이므로 더 높은 정밀도와 12 바이트 long double
을 사용하기로 결정했습니다. 위 예에서 xStepL
의 값은 0.05000000000000000000067762635780344
입니다. 이 값을 double
으로 변환하면 실제로는 0.050000000000000003
이됩니다. 그러나 gdb로 값을 검사하면 다음을 인쇄합니다.
(gdb) p xStep
$1 = 0.050000000000000003
(gdb) p static_cast<double>(xStepL)
$2 = 0.049999999999999996
결과가 다른 이유는 무엇입니까? 나는 실제로 그것이 두 번째 것이되기를 원한다. 누구든지 그 달성 방법을 알고 있습니까?
현재, GCC 4.3.4와 GDB 7.2.50을 사용하고 있습니다.
'0.05'는 이진 부동 소수점으로 표현할 수 없으므로 실제 값은 '0.050000000000000003' ('0x1.999999999999ap-5') 또는'0.049999999999999996' ('0x1.9999999999999p-5') 중 하나가 될 것입니다. 큰 값은 '0.05'('0x1.9 ... ap-5')에 가깝기 때문에 그 값으로 끝내는 것이 더 낫습니다. – ecatmur
이 값은 메모리 액세스의 오프셋으로 나중에 곱해지고 캐스팅됩니다. 불행하게도이 특별한 경우 (테스트 케이스와 절대 경계)에서 차이를 만들고 사용 가능한 메모리를 초과합니다. – t1mg
메모리 문제를 해결할 수있는 방법으로는 bounds와 clamp를 테스트하는 것 (코드로 분기하는 방법)이나 메모리 블록 끝에 중복을 추가하는 방법이 있지만 액세스가 읽기 전용 인 경우에만 작동합니다. –