문제

a의 변환이 얼마나 비싸다 float a double? 그것은 사소한 것입니다 int 에게 long 변환?

편집 : 플로트가 4 바이트이고 더블이 8 바이트 인 플랫폼을 가정합니다.

도움이 되었습니까?

해결책

플랫폼 고려 사항

이것은 플로트 계산에 사용되는 플랫폼에 따라 다릅니다. X87 FPU를 사용하면 레지스터 컨텐츠가 동일하기 때문에 전환은 무료입니다. 때때로 지불 할 수있는 유일한 가격은 메모리 트래픽이지만 많은 경우 전환없이 값을 사용할 수 있으므로 트래픽이 없습니다. X87은 실제로이 점에서 이상한 짐승입니다. 사용 된 지침과 레지스터가 동일하기 때문에 플로트와 복식을 제대로 구별하기가 어렵습니다.로드/스토어 지침과 계산 정밀도 자체는 상태 비트를 사용하여 제어됩니다. . 혼합 플로트/이중 계산을 사용하면 예기치 않은 결과가 발생할 수 있습니다 (이로 인해 정확한 동작 및 최적화 전략을 제어하기위한 컴파일러 명령 줄 옵션이 있습니다).

SSE를 사용하는 경우 (때로는 Visual Studio가 기본적으로 SSE를 사용하는 경우) FPU 레지스터의 값을 전송하거나 변환을 수행하기 위해 명시적인 작업을 수행해야하므로 다를 수 있습니다.

메모리 절약 성능

요약과 다른 곳에서 귀하의 의견에 대한 답변 : 플로팅 계산 결과를 32B 스토리지에 저장하려면 결과는 속도가 동일하거나 빠릅니다.

  • X87 에서이 작업을 수행하면 전환이 무료입니다. 유일한 차이점은 FSTP DWORD []가 FSTP QWORD [] 대신 사용됩니다.
  • SSE가 활성화 된 상태 에서이 작업을 수행하면 계산의 정밀도가 기본 이중의 플로트 인드테드 인 경우 일부 플로트 계산을 SSE로 수행 할 수 있으므로 일부 성능 게인이 표시 될 수도 있습니다.
  • 모든 경우 메모리 트래픽이 낮습니다

다른 팁

일부 플랫폼에서 플로트 ~ 이중 변환이 무료로 발생합니다 (PPC, x86 컴파일러/런타임을 사용하는 경우 사용했다고 말한 유형과 함께 모든 것을 긴 이중으로 평가하겠습니다. Nyah Nyah "평가 모드. ).

SSE 레지스터를 사용하여 플로트 포인트 평가가 실제로 지정된 유형에서 수행되는 X86 환경에서 플로트와 더블 사이의 변환은 플로팅 포인트 추가 또는 곱하기만큼 비싸다 (즉, 성능 고려 사항이 아닌 경우 행위 많이 그들의).

하드웨어 부동 소수점이없는 임베디드 환경에서는 다소 비용이 많이들 수 있습니다.

이것은 사용중인 C ++ 구현에만 해당됩니다. C ++에서는 기본 부동 소수점 유형입니다 더블. 컴파일러는 다음 코드에 대한 경고를 발행해야합니다.

float a = 3.45;

이중 값 3.45가 플로트에 할당되기 때문입니다. 플로트를 구체적으로 사용해야하는 경우 값을 접미사 에프:

float a = 3.45f;

요점은 모든 부동 소수점 숫자가 기본적으로 더블. 컴파일러의 구현 세부 사항이 확실하지 않고 부동 소수점 계산에 대한 이해가 크지 않으면이 기본값을 고수하는 것이 안전합니다. 캐스트를 피하십시오.

또한 4.5 절을 참조하십시오 C ++ 프로그래밍 언어.

너무 복잡 할 것이라고 상상할 수 없습니다. INT를 Long으로 변환하고 플로트를 이중으로 변환하는 것의 큰 차이점은 INT 유형에 두 개의 구성 요소 (부호 및 값)가 있고 부동 소수점 번호에는 세 가지 구성 요소 (부호, Mantissa 및 지수)가 있다는 것입니다.

IEEE 754 단일 정밀도는 부호의 경우 1 비트, 지수의 경우 8 비트, 유의와 23 비트를 사용하여 32 비트로 인코딩됩니다. 그러나 숨겨진 비트를 사용하므로 23 비트 만 사용하여 인코딩 되더라도 24 비트 (P = 24)입니다.

-David Goldberg, 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것

따라서 Float와 Double을 변환하면 동일한 부호 비트를 유지하고 Float Mantissa의 마지막 23/24 비트를 Double 's Mantissa로 설정하고 Float 지수의 마지막 8 비트를 Double의 지수로 설정합니다.

이 행동은 심지어 보장 될 수도 있습니다 IEEE 754... 나는 그것을 확인하지 않았으므로 확실하지 않습니다.

메모리가 더 크고 조작이 더 복잡하기 때문에 int를 길게 변환하는 것보다 약간 느리게 될 것입니다. 좋은 참조 메모리 정렬 문제

어쩌면이 도움이 될 수도 있습니다.

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

double _ftod(float fValue)
{
  char czDummy[30];
  printf(czDummy,"%9.5f",fValue);
  double dValue = strtod(czDummy,NULL);
  return dValue;
}


int main(int argc, char* argv[])
{
  float fValue(250.84f);
  double dValue = _ftod(fValue);//good conversion
  double dValue2 = fValue;//wrong conversion
  printf("%f\n",dValue);//250.840000
  printf("%f\n",dValue2);//250.839996
  getch();
  return 0;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top