0

Quartz는 그래픽에 CGFloat을 사용합니다. CGFloat은 프로세서에 따라 Float 또는 Double입니다.CGFloat가 Float인지 Double인지 확인하는 방법

가속 프레임 워크에는 동일한 기능의 다양한 변형이 있습니다. 예를 들어 Double의 경우 dgetrf_, Float의 경우 sgetrf_입니다.

이 두 가지를 함께 사용해야합니다. 어느 곳에서나 Double을 사 용하여 쿼츠를 사용할 때마다 CGFloat로 변환하거나 CGFloat의 실제 유형을 결정하고 적절한 Accelerate 함수를 사용할 수 있습니다.

내 코드베이스 전체에 CGFloat'sDouble 유형을 섞어 놓는 것은별로 매력이 없으며 매번 수천 또는 수백만 개의 값을 CGFloat로 변환 할 때마다 매우 효과적입니다.

이 순간 나는 두 번째 옵션을 선택했습니다. (그렇지 않아야합니까?)

제 질문은 : CGFloat의 실제 유형을 어떻게 알 수 있습니까?

if ??? //pseudo-code: CGFloat is Double 
{ 
    dgetrf_(...) 
} 
else 
{ 
    sgetrf_(...) 
} 

답변

4

Documentation on Swift Floating-Point Numbers:

부동 소수점 형식은 정수형보다 값의 더 넓은 범위를 나타낼 수 있고, 지능에 저장 될 수있는 것보다 훨씬 크고 작은 번호를 저장할 수있다. Swift는 두 개의 부호있는 부동 소수점 숫자 유형을 제공합니다.

  • Double은 64 비트 부동 소수점 숫자를 나타냅니다.
  • Float는 32 비트 부동 소수점 숫자를 나타냅니다.
당신은 sizeof 기능을 사용하여 테스트 할 수 있습니다

: 아마

if sizeof(CGFloat) == sizeof(Double) { 
    // CGFloat is a Double 
} else { 
    // CGFloat is a Float 
} 

이 적절한 버전을 호출 래퍼 정의 조건부 컴파일을 사용하는 것입니다 처리 할 수있는 가장 쉬운 방법 :

import Accelerate 

func getrf_(__m: UnsafeMutablePointer<__CLPK_integer>, 
      __n: UnsafeMutablePointer<__CLPK_integer>, 
      __a: UnsafeMutablePointer<CGFloat>, 
      __lda: UnsafeMutablePointer<__CLPK_integer>, 
      __ipiv: UnsafeMutablePointer<__CLPK_integer>, 
      __info: UnsafeMutablePointer<__CLPK_integer>) -> Int32 { 

    #if __LP64__ // CGFloat is Double on 64 bit archetecture 
    return dgetrf_(__m, __n, UnsafeMutablePointer<__CLPK_doublereal>(__a), __lda, __ipiv, __info) 
    #else 
    return sgetrf_(__m, __n, UnsafeMutablePointer<__CLPK_real>(__a), __lda, __ipiv, __info) 
    #endif 
} 
+1

x86_64 + arm64 대신 여기 \ LP64 \ __를 테스트 할 수 있습니다. –

+0

고마워, 나는 대답에 그것을 추가 할 것이다. – ColGraff

2

코어 그래픽에 정의 된 매크로는 CGFLOAT_IS_DOUBLE입니다. 당신은 직접적인 비교를 위해 스위프트에서 사용할 수 있습니다 : 물론

if CGFLOAT_IS_DOUBLE == 1 { 
    print("Double") 
} else { 
    print("Float") 
} 

, 직접 크기 비교도 가능합니다 :

if sizeof(CGFloat) == sizeof(Double) {    
} 

그러나, 모든 Float, DoubleCGFloat에 대한 기능이 과부하 때문에 유형의 크기를 검사하는 이유는 거의 없습니다.

+0

'CGFLOAT_IS_DOUBLE'을 사용하기위한 답을 편집 중이었습니다. 내가 주변을 샅샅이 뒤지기 전까지 나는 그것에 대해 몰랐다. 비교를 위해 두 크기를 모두 사용하는 것이 좋습니다. – ColGraff

+0

@ColGraff 불행히도 조건부 컴파일에서 사용할 수있는 것 같지 않습니다.우리는 정의 된 것만을 확인할 수 있습니다. 항상 그렇습니다. – Sulthan

+0

아, 응. 나는 그런 식으로 사용할 수없는 이유가 있다고 생각했습니다. 너무 나빴어. – ColGraff