>백엔드 개발 >C++ >C# 부동 소수점 표현식에서 캐스팅 및 변수 할당이 다른 결과를 생성하는 이유는 무엇입니까?

C# 부동 소수점 표현식에서 캐스팅 및 변수 할당이 다른 결과를 생성하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-08 17:17:41320검색

Why Do Casting and Variable Assignment Produce Different Results in C# Floating-Point Expressions?

C# 부동 소수점 표현식: 강제 유형 변환과 변수 할당의 차이점 분석

C#에서는 단순해 보이는 부동 소수점 산술 표현식이 예상치 못한 결과를 초래할 수 있습니다. 이 문서에서는 이 문제를 자세히 살펴보고 관찰된 차이점의 근본적인 이유를 설명합니다.

문제 설명

다음 코드 조각을 고려하세요.

<code class="language-csharp">int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;</code>

직관적으로 speed1speed2는 모두 6.2f 곱하기 10을 나타내는 동일한 값을 가질 것으로 예상합니다. 그러나 실제로는 두 변수의 값이 서로 다릅니다.

<code>speed1 = 61
speed2 = 62</code>

이 차이는 다음과 같은 질문을 제기합니다. 겉보기에 동일해 보이는 작업이 왜 다른 결과를 낳는가?

설명

이 동작의 이유를 이해하려면 C# 부동 소수점 연산의 미묘함을 파헤쳐야 합니다.

첫 번째 표현식 (int)(6.2f * 10)에서 6.2f * 10의 곱셈 결과는 정수(32비트)로 변환되기 전에 배정밀도 부동 소수점 숫자(64비트)로 처리됩니다. 이 변환은 double의 소수 부분을 잘라 결과가 61이 됩니다.

두 번째 표현식 float tmp = 6.2f * 10에서는 곱셈의 결과가 32비트 정밀도로 부동 변수(tmp)에 저장됩니다. tmp을 정수로 변환하면 부동 소수점 숫자가 가장 가까운 정수로 반올림되어 62가 됩니다.

컴파일러 최적화

C# 컴파일러가 성능상의 이유로 코드를 최적화한다는 점은 주목할 가치가 있습니다. (int)(6.2f * 10)의 경우 컴파일러는 중간 값을 double로 유지하도록 선택하여 캐스팅 중에 정밀도가 손실될 수 있습니다. 하지만 float tmp = 6.2f * 10의 경우 컴파일러는 결과를 변수에 저장하기 전에 가장 가까운 float 값으로 반올림해야 하므로 결과에 차이가 발생합니다.

더 많은 정보

더 명확하게 설명하기 위해 다음 연습을 고려해 보겠습니다.

<code class="language-csharp">double d = 6.2f * 10;
int tmp2 = (int)d;
// 计算 tmp2</code>

이 예에서 tmp2의 값은 곱셈 결과가 정수로 변환되기 전에 double 변수에 저장되기 때문에 62이고, double 데이터 유형은 6.2f * 10을 나타내지 않아도 충분한 정밀도를 갖기 때문입니다. 상당한 정확도 손실.

결론

예기치 않은 결과를 방지하려면 C#의 부동 소수점 연산 속성을 이해하는 것이 중요합니다. 캐스팅 및 반올림 프로세스의 미묘함을 고려함으로써 개발자는 예상대로 작동하고 잠재적인 오류를 방지하는 코드를 작성할 수 있습니다.

위 내용은 C# 부동 소수점 표현식에서 캐스팅 및 변수 할당이 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.