2011-01-19 4 views
3

나는 몇 가지 코드를 다음과 같이 참조 :이 경우이 컴파일러 사용 (float)/(float) 또는 (double)/(float)를 사용하려고겠습니까사용 F 접미사

float num2 = ((this.X * this.X) + (this.Y * this.Y)) + (this.Z * this.Z); 
float num = 1/((float) Math.Sqrt ((double) num2)); 
this.X *= num; 
this.Y *= num; 
this.Z *= num; 

을? : 같은

float num2 = ((this.X * this.X) + (this.Y * this.Y)) + (this.Z * this.Z); 
float num = 1f/((float) Math.Sqrt ((double) num2)); 
this.X *= num; 
this.Y *= num; 
this.Z *= num; 

그것이 중요합니까 두 번째 줄의 예는?

편집 : Btw 성능 차이가 있습니까?

답변

6

두 번째 예제에서는 실제로 (int)/(float)을 사용합니다. Int32는 암시 적으로 Single로 변환되기 때문에 컴파일러는 불평하지 않으며 정상적으로 작동합니다. 당신이 경우에

말했다되고 그건

, 그것은 불평 할 것이다 :

float num = 1.0/((float) Math.Sqrt ((double) num2)); 

이것은 효과적으로 (double)/(double)로 바뀝니다 (double)/(float)을 사용하려고 발생할 것입니다. 컴파일러는 double이 암시 적으로 float 변수로 설정 될 때 불평 할 것입니다.


편집 : Btw는 어떤 성능 차이가 있을까?

아마도 측정 할 수 없습니다. 즉, IL에서 추가 변환 작업을 생성하게 될 것입니다. 이것들은 JIT 중에 제거 될 수 있습니다. 그러나 다시, 그것은 현미경 적입니다. 이 코드를 읽기 쉽게 만들 것이기 ​​때문에

개인적으로, 나는 아마이 사용 배정 밀도 연산을 처리 할 것입니다 :

double num2 = (this.X * this.X) + (this.Y * this.Y) + (this.Z * this.Z); 
float num = (float) (1.0/Math.Sqrt(num2)); 
this.X *= num; 
// ... 
+0

고마워, 또 다른 작은 질문을 추가했습니다. 그걸 압니까? –

+2

@ 조안 : 내가 편집 ... BTW - 내 편집 작업이 훨씬 적습니다;) –

+0

Thanks Reed. 나는 동의한다, 나는 또한 항상 두 배를 사용한다. 제 3 자 라이브러리의이 코드만으로도 혼란 스러웠습니다. –

1

아니오; 그것은 동일 할 것입니다.

1f1.0 (또는 1d)으로 변경하면 결과는 double이됩니다.

+0

감사합니다, 또 다른 작은 질문을 추가했다. 그걸 압니까? –

+2

@ 조안 :'double' 대'float' 연산의 속도는 CPU에 달려 있습니다. – SLaks

+0

감사합니다 SLaks, 그 말이/ –