2012-12-03 2 views
23

내가 int 인 경우 double으로 변환 한 다음 doubleint으로 다시 변환하면 시작한 것과 동일한 값을 다시 얻을 수 있습니까?int-> double-> int는 값 보존을 보장합니까?

int passThroughDouble(int input) 
{ 
    double d = input; 
    return d; 
} 

오전 내가 passThroughDouble(x) == x 모든 intx 보장 : 즉,이 기능을 부여?

+0

int 크기에 따라 달라집니다. 64 비트 ints이 확실히 작동하지 않습니다. 32 비트 정수의 경우 아마 * 작동합니다. –

+1

'assert (std :: numeric_limits :: digits <= std :: numeric_limits :: digits); - http://en.cppreference.com/w/cpp/types/numeric_limits/digits – sehe

+1

@sehe : 확실하게 'static_assert'를 의미합니다. : P – GManNickG

답변

30

아니요. 표준은 intdouble의 상대 크기에 대해서는 아무 것도 말하지 않습니다.

int이 64 비트 정수이고 double이 표준 IEEE 배정 밀도이면 2^53보다 큰 숫자는 이미 실패합니다. 말했다


, int 32 비트 환경의 대다수 오늘 아직도있다. 따라서 많은 경우에 여전히 유효합니다.

+0

어떤 시스템에서 int가 64 비트를 가졌습니까? windows와 linux는 모두 32bit입니다. –

+0

C가 IEEE double precision이라고 생각하지 않습니다. 그것은 단지 배정 밀도를 말한다. 이는 float의 정밀도의 두 배를 의미합니다. 그래서 64 비트 int는 두 배로 정확하게 맞을 것입니다. (확실하게 보장되지는 않습니다.) – pm100

+0

@ JohannesSchaub-litb 64 비트 int를 갖는 리눅스 배포판에 대해 들어 보았습니다. 하지만 그건 라운지에서 얻은 간접 정보였습니다. – Mysticial

12

"전통적인"IEEE-754 스타일의 부동 소수점 형식 표현으로 제한하면 double의 가수가 많은 비트 수를 가진 경우에만이 변환이 값 보존으로 간주 될 수 있습니다 int에 부호가없는 비트가 있기 때문입니다.

유형의 가수는 고전적인 IEEE-754 double 유형의 53 비트 폭 ("내포 된"선행 비트 포함)으로, [-2^53, +2^53] 범위의 정수를 정확하게 나타낼 수 있습니다. 이 범위를 벗어나면 일반적으로 정밀도가 떨어집니다.

따라서, 귀하의 int과 귀하의 double의 크기에 따라 다릅니다. 대답은 특정 플랫폼에 따라 다릅니다. 32 비트 int과 IEEE-754 double을 사용하면 평등이 유지됩니다.

+0

디지털 오디오 시스템은 부동 소수점을 정수로 변환하여 작동하거나 '세계가 회전하지 않습니다'. 화제의 이론을 탐구하고 실제적인 실험을 수행해야만했던 누군가로서, 이것이 올바른 대답이라고 말할 수 있습니다. – Izhaki